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();; }
关键字词: