作者: 萧寒雪
有幸购买到Visual studio .net 的光盘,急忙安装一套,一用感觉非常好,所学写端口扫描程序一只,献给本版的朋友们:)
using System;;
using System.Drawing;;
using System.Collections;;
using System.ComponentModel;;
using System.Windows.Forms;;
//增加的如下..
using System.Data;;
using System.Net.Sockets;;
using System.Net;;
using System.IO;;
using System.Text;;
using System.Threading;;
namespace iPortScan
{
/// 〈summary〉
/// Summary description for Form1.
/// 〈/summary〉
public class Form1 : System.Windows.Forms.Form
{
//该处放的是程序要用到的公共变量
public string scanHost = Dns.GetHostName(,',',');; //默认当前本机IP
public Int32 tport = 0;; //当前连接端口编号
public Int32 connState = 0;; //扫描状态
public int portSum = 0 ;; //端口总计
public bool endThread = false;; //结束状态
public AutoResetEvent asyncOpsAreDone = new AutoResetEvent(false,',',');;
private System.Windows.Forms.Label label1;;
private System.Windows.Forms.TextBox txtHostname;;
private System.Windows.Forms.Button cmdExec;;
private System.Windows.Forms.ListBox logList;;
public System.Windows.Forms.CheckedListBox portList;;
private System.Windows.Forms.Label label2;;
private System.Windows.Forms.Label label3;;
private System.Windows.Forms.NumericUpDown sNum;;
private System.Windows.Forms.NumericUpDown eNum;;
private System.Windows.Forms.CheckBox showdie;;
private System.Windows.Forms.Label label4;;
private System.Windows.Forms.Button button1;;
private System.Windows.Forms.ToolTip toolTip1;;
private System.Windows.Forms.StatusBar statusBar1;;
private System.Windows.Forms.LinkLabel linkLabel1;;
private System.Windows.Forms.LinkLabel linkLabel2;;
private System.ComponentModel.IContainer components;;
/*
此处省略了各个调用的控件的属性设置代码
*/
static void Main()
{
Application.Run(new Form1(),',',');;
}
private void cmdExec_Click(object sender, System.EventArgs e)
{
Int32 startPort = (Int32)sNum.Value;;
Int32 endPort = (Int32)eNum.Value;;
if(txtHostname.Text.Length==0)
{
MessageBox.Show("请输入一个主机的名称吧!","系统提示",',',');;
txtHostname.Text = scanHost.ToString(,',',');;
txtHostname.Focus(,',',');;
return;;
}
if(startPort〉endPort)
{
MessageBox.Show("错误,起始端口必须要小于结束的端口!","系统提示",',',');;
startPort = endPort-1;;
sNum.Text = startPort.ToString(,',',');;
sNum.Focus(,',',');;
return ;;
}
if(cmdExec.Text=="&Scan")
{
endThread= false;;
cmdExec.Text= "&Stop";;
}
else
{
endThread= true;;
cmdExec.Text= "&Scan";;
}
if(endThread!=true)
{
connState = 0;;
portSum = 0;;
scanHost = txtHostname.Text;;
try
{
IPAddress ipaddr =(IPAddress)Dns.Resolve(scanHost).AddressList.GetValue(0,',',');;
txtHostname.Text = ipaddr.ToString(,',',');;
}
catch
{
txtHostname.Focus(,',',');;
MessageBox.Show("请输入正确的主机地址,该地址DNS无法解析","系统提示",',',');;
return ;;
}
logList.Items.Clear(,',',');;
for (Int32 threadNum = startPort;; threadNum 〈=endPort;; threadNum++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(Startscan),threadNum,',',');;
logList.Items.Add ("扫描端口:" + threadNum.ToString(),',',');;
}
}
}
public void Startscan(Object state)
{
Int32 port = (Int32) state;;
string tMsg = "";;
string getData = "";;
int lindex = 0;;
int eindex = 0;;
connState++;; //判断线程数目
if(endThread==true)
{
if(connState==((Int32)eNum.Value-(Int32)sNum.Value))
{
cmdExec.Text = "&Scan";;
logList.Items.Add ("扫描完毕!",',',');;
}
else
{
cmdExec.Text = "&Stop";;
logList.Items.Add ("正在停止对"+port.ToString()+"端口的扫描线程",',',');;
}
logList.Items.Add("结束线程:"+port.ToString(),',',');;
asyncOpsAreDone.Close(,',',');;
}
else
{
try
{
TcpClient tcp = new TcpClient(,',',');;
tcp.Connect(scanHost,port,',',');;
//该处如果建立连接错误的话,将不执行下面的代码..
portSum ++;;
lindex = portList.Items.Add(port.ToString() + "端口开放",false,',',');;
portList.SelectedIndex=lindex;;
Stream sm = tcp.GetStream(,',',');;
sm.Write(Encoding.Default.GetBytes(tMsg.ToCharArray()),0,tMsg.Length,',',');;
StreamReader sr = new StreamReader(tcp.GetStream(),Encoding.Default,',',');;
getData = sr.ReadLine(,',',');;
if(lindex!=0&&getData.Length!=0)
{
tMsg = " +-" + port.ToString() + "端口数据:"+getData.ToString(,',',');;
eindex = portList.Items.Add(tMsg,',',');; //插入一条信息记录
portList.Items.Insert(lindex+1,tMsg,',',');;
portList.Items.RemoveAt(eindex,',',');;
}
sr.Close(,',',');;
sm.Close(,',',');;
tcp.Close(,',',');;
}
catch
{
//显示坏死的端口
if(showdie.Checked==true)
{
portList.Items.Add(port.ToString()+"端口无法连接,回传数据为空",',',');;
}
}
finally
{
Thread.Sleep(0,',',');;
logList.Items.Add("结束线程:"+port.ToString(),',',');;
asyncOpsAreDone.Close(,',',');;
statusBar1.Text = "端口总计:"+portSum.ToString() ;;
if(connState==((Int32)eNum.Value-(Int32)sNum.Value))
{
cmdExec.Text = "&Scan";;
}
}
}
}
private void button1_Click(object sender, System.EventArgs e)
{
Application.Exit(,',',');;
}
关键字词:

