C#端口扫描

80酷酷网    80kuku.com

  端口扫描

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 = new Label();
  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();
  }

 }
}

分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: