天天看点

C#扫描计算机端口

using system;

using system.collections.generic;

using system.text;

using system.net;

using system.net.sockets;

using system.threading;

namespace portscanner

{

class program

 //已扫描端口数目

 internal static int scannedcount = 0;

 //正在运行的线程数目

 internal static int runningthreadcount = 0;

 //打开的端口数目

 internal static list<int> openedports = new list<int>();

 //起始扫描端口

 static int startport = 1;

 //结束端口号

 static int endport = 500;

 //最大工作线程数

 static int maxthread = 10;

 static void main(string[] args)

 {

  //接收传入参数一作为要扫描的主机

  string host = "192.168.0.1";

  //接收传入参数二作为端口扫描范围,如1-4000

  string portrange = "1-400";

  startport = int.parse(portrange.split('-')[0].trim());

  endport = int.parse(portrange.split('-')[1].trim());

  for (int port = startport; port < endport; port++)

  {

   //创建扫描类

   scanner scanner = new scanner(host, port);

   thread thread = new thread(new threadstart(scanner.scan));

   thread.name = port.tostring();

    thread.isbackground = true;

   //启动扫描线程

   thread.start();

   runningthreadcount++;

   thread.sleep(10);

   //循环,直到某个线程工作完毕才启动另一新线程,也可以叫做推拉窗技术

   while (runningthreadcount >= maxthread) ;

  }

  //空循环,直到所有端口扫描完毕

  while (scannedcount + 1 < (endport - startport)) ;

   console.writeline();

   //输出结果

   console.writeline("scan for host: {0} has been completed , /n total {1} ports scanned, /nopened ports :{2}",

host, (endport - startport), openedports.count);

  foreach (int port in openedports)

   console.writeline("/tport: {0} is open", port.tostring().padleft(6));

 }

}

//扫描类

class scanner

 string m_host;

 int m_port;

 

 public scanner(string host, int port)

  m_host = host; m_port = port;

 public void scan()

  //我们直接使用比较高级的tcpclient类

  tcpclient tc = new tcpclient();

  //设置超时时间

  tc.sendtimeout = tc.receivetimeout = 2000;

  try

   //console.write("checking port: {0}", m_port);

   //尝试连接

   tc.connect(m_host, m_port);

   if (tc.connected)

   {

    //如果连接上,证明此端口为开放状态

    console.writeline("port {0} is open", m_port.tostring().padright(6));

    program.openedports.add(m_port);

   }

  catch (system.net.sockets.socketexception e)

   //容错处理

   console.writeline("port {0} is closed", m_port.tostring().padright(6));

    //console.writeline(e.message);

   }

   finally

   {

    tc.close();

    tc = null;

    program.scannedcount++;

  program.runningthreadcount--;

    //console.writeline(program.scannedcount);

  }