软件频道>程序开发>JavaVBVCDelphiC/C++Web开发微软专栏移动数据库程序人生软件工程|开发客
您现在的位置: 天极网 > 开发频道 > C#打造快速的端口扫描器
全文

C#打造快速的端口扫描器

2008-07-18 08:53作者:cnblogs sherlockhua出处:天极网责任编辑:nancy

  实现效果图:(windows窗体版)

  实现效果图:(控制台版)

  端口扫描器大家都不陌生吧,用着别人的端口扫描器,虽说方便,但是如果能够做一个,当然是一个赏心悦目的事。其实,实现自己的端口扫描器并不困难。而且原理也比较简单,只要我们具备基础的网络知识,明白tcp三次握手原则即可。

  C#提供一组网络编程的类,使网络编程更加简单优美。其中,Socket封装了大多数用于网络通讯的api,要实现端口扫描,我们只需使用Socket.Connect()方法。然后再判断Socket.Connected是否为真,如果为真 ,则表明该端口可以连接,也就是说该端口是开放的。所以,判断一个端口是否开放的代码如下:

  public void ThreadFunc(object o)
   {
   int port = (int)o;
   ScanSocket s = new ScanSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
   s.Port = port;
   IPEndPoint ipport = new IPEndPoint(scanIP, port);
   try
   {
   // s.BeginConnect(ipport, new AsyncCallback(EndConnect), s);
   s.Connect(ipport);
   if (s.Connected == true)
   OnPortConnect(null, new ScanEventArg(s.Port));
   }
   catch (Exception e)
   {
  
   }
   finally
   {
   lock (this)
   {
   finishThreads++;
   }
   if (OnPortThreadFinish != null)
   OnPortThreadFinish(null, null);
   }
   }

  为了实现快速扫描,不可避免的要使用多线程的。我的实现的思路是,每个线程只扫描一个端口号。扫描完了再分配一个新的端口号。直到所有的端口号扫描完为止(不知道大家有没有更好的方法呢)代码如下:

   private void MainScan()
   {
   if (!AdjustPortAndIP(ip,ref sport, ref eport))
   {
   if (OnPortError != null)
   OnPortError(null, null);
   return;
   }
   if (maxThreadCount > DEFAULT_THREAD_COUNT)
   {
   maxThreadCount = DEFAULT_THREAD_COUNT;
   }
   realThreadCount = 0;
  
   ScanThread st = new ScanThread();
   st.ScanIP = this.scanIP;
   st.OnPortConnect += new ScanHandler(st_OnPortConnect);
   st.OnPortThreadFinish += new EventHandler(st_OnPortThreadFinish);
   for (int i = sport; i <= eport; i++,realThreadCount++)
   {
   while (realThreadCount-st.FinishThreads > maxThreadCount)
   {
   Thread.Sleep(10);
   }
   Thread.Sleep(10);
   ParameterizedThreadStart ps = new ParameterizedThreadStart(st.ThreadFunc);
   Thread start = new Thread(ps);
   start.Start(i);
   }
   while (st.FinishThreads != realThreadCount) Thread.Sleep(1000);//等到所有线程全退出为止
   //Thread.Sleep(10000);
   if (OnScanFinish != null) //通知客户端扫描已经完成
   OnScanFinish(null, null);
   }

  为了和客户段进行交互,所以在ScanPort.cs里定义了几个事件: 

       public event EventHandler OnPortError;
   public event EventHandler OnScanFinish;
   public event ScanHandler OnPortConnect;
   public event EventHandler OnPortThreadFinish;

  分别代表扫描已经完成,该端口是开的和该端口已经扫描完毕。好了,有这些基础,相信实现自己的扫描器也不难了,具体实现参照原代码。

  如何使用:先把scandll.dll添加到工程中,然后指定ip地址和端口号即可,代码如下:

  scanPort.Scan(ip,sPort,ePort,threadCount);

相关搜索:
关注此文读者还看过
文章排行
本周
本月
最近更新
关于我们|About us|网站律师|天极服务|电子杂志|RSS订阅|加入我们|网站地图
TMG
Copyright (C) 1999-2009 Chinabyte.com, All Rights Reserved 版权所有 天极网络
商务联系、网站内容、合作建议:010-82657868
版权声明 在线提交意见反馈 渝ICP证B2-20030003号
经营性网站备案信息 网警备案 中国网站排名
天极传媒:天极网|比特网|IT专家网|IT商网|52PK游戏网|IT分众