using System;
using System.Drawing;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;

namespace PortScanner
{
	public class MainApp: System.Windows.Forms.Form
	{
		private System.Windows.Forms.TextBox txtAddr;
		private System.Windows.Forms.TextBox txtStart;
		private System.Windows.Forms.TextBox txtEnd;
		private System.Windows.Forms.Label label1;
		private System.Windows.Forms.Label label2;
		private System.Windows.Forms.Label label3;
		private System.Windows.Forms.Splitter splitter1;
		private System.Windows.Forms.ListBox lbResult;
		private System.Windows.Forms.Button btnScan;
		private System.Windows.Forms.ProgressBar progressBar1;
		private System.Windows.Forms.Label lblStart;
		private System.Windows.Forms.Label lblStop;
		private System.Windows.Forms.Label lblNow;
		private int port;
		private string Addr;
		private bool[] done = new bool[65536];
		private int start;
		private int end;
		private Thread scanThread;
		private bool OK;
		public MainApp() 
		{
			InitializeComponent();
		}

		private void InitializeComponent()
		{
			this.lbResult = new System.Windows.Forms.ListBox();
			this.txtAddr = new System.Windows.Forms.TextBox();
			this.txtStart = new System.Windows.Forms.TextBox();
			this.txtEnd = new System.Windows.Forms.TextBox();
			this.label1 = new System.Windows.Forms.Label();
			this.label2 = new System.Windows.Forms.Label();
			this.label3 = new System.Windows.Forms.Label();
			this.splitter1 = new System.Windows.Forms.Splitter();
			this.btnScan = new System.Windows.Forms.Button();
			this.progressBar1 = new System.Windows.Forms.ProgressBar();
			this.lblStart = new System.Windows.Forms.Label();
			this.lblStop = new System.Windows.Forms.Label();
			this.lblNow = new System.Windows.Forms.Label();
			this.SuspendLayout();
			// 
			// lbResult
			// 
			this.lbResult.Dock = System.Windows.Forms.DockStyle.Right;
			this.lbResult.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
			this.lbResult.ItemHeight = 14;
			this.lbResult.Location = new System.Drawing.Point(224, 0);
			this.lbResult.Name = "lbResult";
			this.lbResult.Size = new System.Drawing.Size(264, 270);
			this.lbResult.TabIndex = 0;
			// 
			// txtAddr
			// 
			this.txtAddr.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
			this.txtAddr.Location = new System.Drawing.Point(72, 16);
			this.txtAddr.Name = "txtAddr";
			this.txtAddr.Size = new System.Drawing.Size(136, 22);
			this.txtAddr.TabIndex = 1;
			this.txtAddr.Text = "";
			// 
			// txtStart
			// 
			this.txtStart.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
			this.txtStart.Location = new System.Drawing.Point(72, 48);
			this.txtStart.Name = "txtStart";
			this.txtStart.Size = new System.Drawing.Size(136, 22);
			this.txtStart.TabIndex = 2;
			this.txtStart.Text = "";
			this.txtStart.TextChanged += new System.EventHandler(this.txtStart_TextChanged);
			// 
			// txtEnd
			// 
			this.txtEnd.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
			this.txtEnd.Location = new System.Drawing.Point(72, 80);
			this.txtEnd.Name = "txtEnd";
			this.txtEnd.Size = new System.Drawing.Size(136, 22);
			this.txtEnd.TabIndex = 3;
			this.txtEnd.Text = "";
			this.txtEnd.TextChanged += new System.EventHandler(this.txtEnd_TextChanged);
			// 
			// label1
			// 
			this.label1.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
			this.label1.Location = new System.Drawing.Point(8, 16);
			this.label1.Name = "label1";
			this.label1.Size = new System.Drawing.Size(64, 23);
			this.label1.TabIndex = 4;
			this.label1.Text = "主机地址";
			// 
			// label2
			// 
			this.label2.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
			this.label2.Location = new System.Drawing.Point(8, 80);
			this.label2.Name = "label2";
			this.label2.Size = new System.Drawing.Size(64, 23);
			this.label2.TabIndex = 5;
			this.label2.Text = "结束端口";
			// 
			// label3
			// 
			this.label3.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
			this.label3.Location = new System.Drawing.Point(8, 48);
			this.label3.Name = "label3";
			this.label3.Size = new System.Drawing.Size(64, 23);
			this.label3.TabIndex = 6;
			this.label3.Text = "起始端口";
			// 
			// splitter1
			// 
			this.splitter1.Dock = System.Windows.Forms.DockStyle.Right;
			this.splitter1.Location = new System.Drawing.Point(221, 0);
			this.splitter1.Name = "splitter1";
			this.splitter1.RightToLeft = System.Windows.Forms.RightToLeft.Yes;
			this.splitter1.Size = new System.Drawing.Size(3, 273);
			this.splitter1.TabIndex = 7;
			this.splitter1.TabStop = false;
			// 
			// btnScan
			// 
			this.btnScan.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
			this.btnScan.Location = new System.Drawing.Point(72, 200);
			this.btnScan.Name = "btnScan";
			this.btnScan.TabIndex = 8;
			this.btnScan.Text = "扫描";
			this.btnScan.Click += new System.EventHandler(this.btnScan_Click);
			// 
			// progressBar1
			// 
			this.progressBar1.Location = new System.Drawing.Point(8, 112);
			this.progressBar1.Name = "progressBar1";
			this.progressBar1.Size = new System.Drawing.Size(200, 23);
			this.progressBar1.Step = 1;
			this.progressBar1.TabIndex = 9;
			// 
			// lblStart
			// 
			this.lblStart.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
			this.lblStart.Location = new System.Drawing.Point(8, 144);
			this.lblStart.Name = "lblStart";
			this.lblStart.Size = new System.Drawing.Size(48, 23);
			this.lblStart.TabIndex = 10;
			// 
			// lblStop
			// 
			this.lblStop.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
			this.lblStop.Location = new System.Drawing.Point(160, 144);
			this.lblStop.Name = "lblStop";
			this.lblStop.Size = new System.Drawing.Size(48, 23);
			this.lblStop.TabIndex = 11;
			// 
			// lblNow
			// 
			this.lblNow.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
			this.lblNow.Location = new System.Drawing.Point(84, 144);
			this.lblNow.Name = "lblNow";
			this.lblNow.Size = new System.Drawing.Size(48, 23);
			this.lblNow.TabIndex = 12;
			// 
			// MainApp
			// 
			this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
			this.ClientSize = new System.Drawing.Size(488, 273);
			this.Controls.AddRange(new System.Windows.Forms.Control[] {
																		  this.lblNow,
																		  this.lblStop,
																		  this.lblStart,
																		  this.progressBar1,
																		  this.btnScan,
																		  this.splitter1,
																		  this.label3,
																		  this.label2,
																		  this.label1,
																		  this.txtEnd,
																		  this.txtStart,
																		  this.txtAddr,
																		  this.lbResult});
			this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
			this.Name = "MainApp";
			this.Text = "端口扫描器";
			this.ResumeLayout(false);

		}

		[STAThread]
		static void Main() 
		{
			Application.Run(new MainApp());
		}

		

		private void btnScan_Click(object sender, System.EventArgs e)
		{
            Thread process = new Thread(new ThreadStart(PortScan));
			process.Start();
			progressBar1.Minimum=Int32.Parse(txtStart.Text);
			progressBar1.Maximum=Int32.Parse(txtEnd.Text);
			lbResult.Items.Clear();
			lbResult.Items.Add("端口扫描器 v1.0.");
			lbResult.Items.Add("");		
		}	

		private void PortScan()
		{
			start =Int32.Parse(txtStart.Text);
			end = Int32.Parse(txtEnd.Text);
			if ((start >= 0 && start <= 65536) && (end >= 0 && end <= 65536)) 
			{
				lbResult.Items.Add("开始扫描... (可能需要请您等待几分钟)");
				Addr = txtAddr.Text;
				for (int i=start; i<=end; i++) 
				{
					port = i;
                    scanThread = new Thread(new ThreadStart(Scan));
					scanThread.Start();
					System.Threading.Thread.Sleep(100);
					progressBar1.Value=i;
					lblNow.Text=i.ToString();
				}
				while (!OK) 
				{
					OK = true;
					for (int i=start; i<=end; i++) 
					{
						if (!done[i]) 
						{
							OK = false;
							break;
						}
					}                    
					System.Threading.Thread.Sleep(1000);
				}
				lbResult.Items.Add("扫描结束!");
			} 
			else 
			{
				MessageBox.Show("可用的端口范围为[0-65536]");
			}
		}

		private void Scan() 
		{
			int portnow=port;
			Thread Threadnow=scanThread;
			done[portnow]=true;
			TcpClient objTCP=null;
						
			try
			{
				objTCP = new TcpClient(Addr, portnow);
				lbResult.Items.Add("端口 " + portnow.ToString() + " 开放!");
			}			
			catch
			{}		
		}

		private void txtStart_TextChanged(object sender, System.EventArgs e)
		{
			lblStart.Text=txtStart.Text;
		}

		private void txtEnd_TextChanged(object sender, System.EventArgs e)
		{
			lblStop.Text=txtEnd.Text;
		}

		
	}		
}
