主页 > 编程资料 > C# >
发布时间:2015-09-26 作者:网络 阅读:208次

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


关键字词: