主页 > 编程资料 > C# >
发布时间:2015-09-25 作者:网络 阅读:203次
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();; 
}


关键字词: