Skip Navigation Links
技术文档
·网站建设
·软件使用
·图形设计
·程序开发
·网络应用
·电脑技巧
 
公司介绍
·公司简介
·索仕SRCOS网络应用平台
·索仕网站管理系统
·影视广告制作
·联系我们
 
 

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

7/18/2008 2:49:09 PM

原代码:scan.rar
实现效果图:(windows窗体版)
C#打造快速的端口扫描器
实现效果图:(控制台版)
C#打造快速的端口扫描器
 

端口扫描器大家都不陌生吧,用着别人的端口扫描器,虽说方便,但是如果能够做一个,当然是一个赏心悦目的事。其实,实现自己的端口扫描器并不困难。而且原理也比较简单,只要我们具备基础的网络知识,明白tcp三次握手原则即可。
      C#提供一组网络编程的类,使网络编程更加简单优美。其中,Socket封装了大多数用于网络通讯的api,要实现端口扫描,我们只需使用Socket.Connect()方法。然后再判断Socket.Connected是否为真,如果为真 ,则表明该端口可以连接,也就是说该端口是开放的。所以,判断一个端口是否开放的代码如下:

 

C#打造快速的端口扫描器public void ThreadFunc(object o)
        
{
C#打造快速的端口扫描器            
int port = (int)o;
C#打造快速的端口扫描器            ScanSocket s 
= new ScanSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
C#打造快速的端口扫描器            s.Port 
= port;
C#打造快速的端口扫描器            IPEndPoint ipport 
= new IPEndPoint(scanIP, port);
C#打造快速的端口扫描器            
try
            
{
C#打造快速的端口扫描器                
// s.BeginConnect(ipport, new AsyncCallback(EndConnect), s);
C#打造快速的端口扫描器
                s.Connect(ipport);
C#打造快速的端口扫描器                
if (s.Connected == true)
C#打造快速的端口扫描器                    OnPortConnect(
nullnew ScanEventArg(s.Port));
C#打造快速的端口扫描器            }

C#打造快速的端口扫描器            
catch (Exception e)
            
{
C#打造快速的端口扫描器 
C#打造快速的端口扫描器            }

C#打造快速的端口扫描器            
finally
            
{
C#打造快速的端口扫描器                
lock (this)
                
{
C#打造快速的端口扫描器                    finishThreads
++;
C#打造快速的端口扫描器                }

C#打造快速的端口扫描器                
if (OnPortThreadFinish != null)
C#打造快速的端口扫描器                    OnPortThreadFinish(
nullnull);
C#打造快速的端口扫描器            }

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


 

为了实现快速扫描,不可避免的要使用多线程的。我的实现的思路是,每个线程只扫描一个端口号。扫描完了再分配一个新的端口号。直到所有的端口号扫描完为止(不知道大家有没有更好的方法呢)代码如下:
 
C#打造快速的端口扫描器   private  void MainScan()
        
{
C#打造快速的端口扫描器            
if (!AdjustPortAndIP(ip,ref sport, ref eport))
            
{
C#打造快速的端口扫描器                
if (OnPortError != null)
C#打造快速的端口扫描器                    OnPortError(
nullnull);
C#打造快速的端口扫描器                
return;
C#打造快速的端口扫描器            }

C#打造快速的端口扫描器            
if (maxThreadCount > DEFAULT_THREAD_COUNT)
            
{
C#打造快速的端口扫描器                maxThreadCount 
= DEFAULT_THREAD_COUNT;
C#打造快速的端口扫描器            }

C#打造快速的端口扫描器            realThreadCount 
= 0;
C#打造快速的端口扫描器           
C#打造快速的端口扫描器            ScanThread st 
= new ScanThread();
C#打造快速的端口扫描器            st.ScanIP 
= this.scanIP;
C#打造快速的端口扫描器            st.OnPortConnect 
+= new ScanHandler(st_OnPortConnect);
C#打造快速的端口扫描器            st.OnPortThreadFinish 
+= new EventHandler(st_OnPortThreadFinish);
C#打造快速的端口扫描器            
for (int i = sport; i <= eport; i++,realThreadCount++)
            
{
C#打造快速的端口扫描器                
while (realThreadCount-st.FinishThreads > maxThreadCount)
                
{
C#打造快速的端口扫描器                    Thread.Sleep(
10);
C#打造快速的端口扫描器                }

C#打造快速的端口扫描器                Thread.Sleep(
10);
C#打造快速的端口扫描器                ParameterizedThreadStart ps 
= new ParameterizedThreadStart(st.ThreadFunc);
C#打造快速的端口扫描器                Thread start 
= new Thread(ps);
C#打造快速的端口扫描器                start.Start(i);
C#打造快速的端口扫描器            }

C#打造快速的端口扫描器            
while (st.FinishThreads != realThreadCount) Thread.Sleep(1000);//等到所有线程全退出为止
C#打造快速的端口扫描器            
//Thread.Sleep(10000);
C#打造快速的端口扫描器
            if (OnScanFinish != null)                                       //通知客户端扫描已经完成
C#打造快速的端口扫描器
                OnScanFinish(nullnull);
C#打造快速的端口扫描器        }

      为了和客户段进行交互,所以在ScanPort.cs里定义了几个事件:
C#打造快速的端口扫描器  public  event EventHandler OnPortError;
C#打造快速的端口扫描器        
public event EventHandler OnScanFinish;
C#打造快速的端口扫描器        
public  event ScanHandler OnPortConnect;
C#打造快速的端口扫描器        
public event EventHandler OnPortThreadFinish;


 

 
分别代表扫描已经完成,该端口是开的和该端口已经扫描完毕。好了,有这些基础,相信实现自己的扫描器也不难了,具体实现参照原代码。  
    如何使用:先把scandll.dll添加到工程中,然后指定ip地址和端口号即可,代码如下:
    
scanPort.Scan(ip,sPort,ePort,threadCount);
本文附件:
scan.rar
作者:少林 来源:博客园
 
 
 
昆明索仕科技开发有限公司 版权所有 Copyright© 2002-2010 Kunming Source Technology Exploitive Co.,LTD. All Rights Reserved.
电话:0871-5627877 业务QQ:163871 联系我们
本站基于:索仕网站信息管理系统建设 版本 2.0.4325