基于C#实现的端口扫描器实例代码
本文所述为基于C#实现的端口扫描器代码,代码内包括了窗体和逻辑处理两部分代码。在代码中,创建TcpClient对象,把TcpClient用于为TCP网络服务提供客户端连接,创建线程,并创建ThreadStart委托对象,端口扫描范围为[0-65536],也可自定义扫描范围。
功能主要代码如下:
usingSystem; usingSystem.Drawing; usingSystem.Windows.Forms; usingSystem.Net.Sockets; usingSystem.Threading; namespacePortScanner { publicclassForm1:System.Windows.Forms.Form { privateSystem.Windows.Forms.TextBoxtxtAddr; privateSystem.Windows.Forms.TextBoxtxtStart; privateSystem.Windows.Forms.TextBoxtxtEnd; privateSystem.Windows.Forms.Labellabel1; privateSystem.Windows.Forms.Labellabel2; privateSystem.Windows.Forms.Labellabel3; privateSystem.Windows.Forms.Splittersplitter1; privateSystem.Windows.Forms.ListBoxlbResult; privateSystem.Windows.Forms.ButtonbtnScan; privateSystem.Windows.Forms.ProgressBarprogressBar1; privateSystem.Windows.Forms.LabellblStart; privateSystem.Windows.Forms.LabellblStop; privateSystem.Windows.Forms.LabellblNow; //自定义变量 privateintport; privatestringAddr; privatebool[]done=newbool[65536]; privateintstart; privateintend; privateThreadscanThread; privateboolOK; publicForm1() { InitializeComponent(); } privatevoidInitializeComponent() { this.lbResult=newSystem.Windows.Forms.ListBox(); this.txtAddr=newSystem.Windows.Forms.TextBox(); this.txtStart=newSystem.Windows.Forms.TextBox(); this.txtEnd=newSystem.Windows.Forms.TextBox(); this.label1=newSystem.Windows.Forms.Label(); this.label2=newSystem.Windows.Forms.Label(); this.label3=newSystem.Windows.Forms.Label(); this.splitter1=newSystem.Windows.Forms.Splitter(); this.btnScan=newSystem.Windows.Forms.Button(); this.progressBar1=newSystem.Windows.Forms.ProgressBar(); this.lblStart=newSystem.Windows.Forms.Label(); this.lblStop=newSystem.Windows.Forms.Label(); this.lblNow=newSystem.Windows.Forms.Label(); this.SuspendLayout(); // //lbResult // this.lbResult.Dock=System.Windows.Forms.DockStyle.Right; this.lbResult.Font=newSystem.Drawing.Font("Tahoma",9F,System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point,((System.Byte)(0))); this.lbResult.ItemHeight=14; this.lbResult.Location=newSystem.Drawing.Point(224,0); this.lbResult.Name="lbResult"; this.lbResult.Size=newSystem.Drawing.Size(264,270); this.lbResult.TabIndex=0; // //txtAddr // this.txtAddr.Font=newSystem.Drawing.Font("Tahoma",9F,System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point,((System.Byte)(0))); this.txtAddr.Location=newSystem.Drawing.Point(72,16); this.txtAddr.Name="txtAddr"; this.txtAddr.Size=newSystem.Drawing.Size(136,22); this.txtAddr.TabIndex=1; this.txtAddr.Text=""; // //txtStart // this.txtStart.Font=newSystem.Drawing.Font("Tahoma",9F,System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point,((System.Byte)(0))); this.txtStart.Location=newSystem.Drawing.Point(72,48); this.txtStart.Name="txtStart"; this.txtStart.Size=newSystem.Drawing.Size(136,22); this.txtStart.TabIndex=2; this.txtStart.Text=""; this.txtStart.TextChanged+=newSystem.EventHandler(this.txtStart_TextChanged); // //txtEnd // this.txtEnd.Font=newSystem.Drawing.Font("Tahoma",9F,System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point,((System.Byte)(0))); this.txtEnd.Location=newSystem.Drawing.Point(72,80); this.txtEnd.Name="txtEnd"; this.txtEnd.Size=newSystem.Drawing.Size(136,22); this.txtEnd.TabIndex=3; this.txtEnd.Text=""; this.txtEnd.TextChanged+=newSystem.EventHandler(this.txtEnd_TextChanged); // //label1 // this.label1.Font=newSystem.Drawing.Font("Tahoma",9F,System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point,((System.Byte)(0))); this.label1.Location=newSystem.Drawing.Point(8,16); this.label1.Name="label1"; this.label1.Size=newSystem.Drawing.Size(64,23); this.label1.TabIndex=4; this.label1.Text="主机地址"; // //label2 // this.label2.Font=newSystem.Drawing.Font("Tahoma",9F,System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point,((System.Byte)(0))); this.label2.Location=newSystem.Drawing.Point(8,80); this.label2.Name="label2"; this.label2.Size=newSystem.Drawing.Size(64,23); this.label2.TabIndex=5; this.label2.Text="结束端口"; // //label3 // this.label3.Font=newSystem.Drawing.Font("Tahoma",9F,System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point,((System.Byte)(0))); this.label3.Location=newSystem.Drawing.Point(8,48); this.label3.Name="label3"; this.label3.Size=newSystem.Drawing.Size(64,23); this.label3.TabIndex=6; this.label3.Text="起始端口"; // //splitter1 // this.splitter1.Dock=System.Windows.Forms.DockStyle.Right; this.splitter1.Location=newSystem.Drawing.Point(221,0); this.splitter1.Name="splitter1"; this.splitter1.RightToLeft=System.Windows.Forms.RightToLeft.Yes; this.splitter1.Size=newSystem.Drawing.Size(3,273); this.splitter1.TabIndex=7; this.splitter1.TabStop=false; // //btnScan // this.btnScan.Font=newSystem.Drawing.Font("Tahoma",9F,System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point,((System.Byte)(0))); this.btnScan.Location=newSystem.Drawing.Point(72,200); this.btnScan.Name="btnScan"; this.btnScan.TabIndex=8; this.btnScan.Text="扫描"; this.btnScan.Click+=newSystem.EventHandler(this.btnScan_Click); // //progressBar1 // this.progressBar1.Location=newSystem.Drawing.Point(8,112); this.progressBar1.Name="progressBar1"; this.progressBar1.Size=newSystem.Drawing.Size(200,23); this.progressBar1.Step=1; this.progressBar1.TabIndex=9; // //lblStart // this.lblStart.Font=newSystem.Drawing.Font("Tahoma",9F,System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point,((System.Byte)(0))); this.lblStart.Location=newSystem.Drawing.Point(8,144); this.lblStart.Name="lblStart"; this.lblStart.Size=newSystem.Drawing.Size(48,23); this.lblStart.TabIndex=10; // //lblStop // this.lblStop.Font=newSystem.Drawing.Font("Tahoma",9F,System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point,((System.Byte)(0))); this.lblStop.Location=newSystem.Drawing.Point(160,144); this.lblStop.Name="lblStop"; this.lblStop.Size=newSystem.Drawing.Size(48,23); this.lblStop.TabIndex=11; // //lblNow // this.lblNow.Font=newSystem.Drawing.Font("Tahoma",9F,System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point,((System.Byte)(0))); this.lblNow.Location=newSystem.Drawing.Point(84,144); this.lblNow.Name="lblNow"; this.lblNow.Size=newSystem.Drawing.Size(48,23); this.lblNow.TabIndex=12; this.AutoScaleBaseSize=newSystem.Drawing.Size(6,15); this.ClientSize=newSystem.Drawing.Size(488,273); this.Controls.Add(this.lblNow); this.Controls.Add(this.lblStop); this.Controls.Add(this.lblStart); this.Controls.Add(this.progressBar1); this.Controls.Add(this.btnScan); this.Controls.Add(this.splitter1); this.Controls.Add(this.label3); this.Controls.Add(this.label2); this.Controls.Add(this.label1); this.Controls.Add(this.txtEnd); this.Controls.Add(this.txtStart); this.Controls.Add(this.txtAddr); this.Controls.Add(this.lbResult); this.Font=newSystem.Drawing.Font("Tahoma",9F,System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point,((System.Byte)(0))); this.Name="Form1"; this.Text="端口扫描器"; this.ResumeLayout(false); } [STAThread] staticvoidMain() { Application.Run(newForm1()); } privatevoidbtnScan_Click(objectsender,System.EventArgse) { //创建线程,并创建ThreadStart委托对象 Threadprocess=newThread(newThreadStart(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(""); } privatevoidPortScan() { start=Int32.Parse(txtStart.Text); end=Int32.Parse(txtEnd.Text); //检查输入范围合法性 if((start>=0&&start<=65536)&&(end>=0&&end<=65536)&&(start<=end)) { lbResult.Items.Add("开始扫描...(可能需要请您等待几分钟)"); Addr=txtAddr.Text; for(inti=start;i<=end;i++) { port=i; //使用该端口的扫描线程 scanThread=newThread(newThreadStart(Scan)); scanThread.Start(); //使线程睡眠 System.Threading.Thread.Sleep(100); progressBar1.Value=i; lblNow.Text=i.ToString(); } //未完成时情况 while(!OK) { OK=true; for(inti=start;i<=end;i++) { if(!done[i]) { OK=false; break; } } System.Threading.Thread.Sleep(1000); } lbResult.Items.Add("扫描结束!"); } else { MessageBox.Show("输入错误,端口范围为[0-65536]"); } } privatevoidScan() { intportnow=port; //创建线程变量 ThreadThreadnow=scanThread; done[portnow]=true; //创建TcpClient对象,TcpClient用于为TCP网络服务提供客户端连接 TcpClientobjTCP=null; //扫描端口,成功则写入信息 try { //用TcpClient对象扫描端口 objTCP=newTcpClient(Addr,portnow); lbResult.Items.Add("端口"+portnow.ToString()+"开放!"); } catch { } } privatevoidtxtStart_TextChanged(objectsender,System.EventArgse) { //获取输入的起始端口值 lblStart.Text=txtStart.Text; } privatevoidtxtEnd_TextChanged(objectsender,System.EventArgse) { //获取输入的接受端口值 lblStop.Text=txtEnd.Text; } } }