基于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;
}
}
}