作者: 萧寒雪
有幸购买到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(,',',');; }
关键字词: