C#打造快速的連接埠掃描器

來源:互聯網
上載者:User

實現windows表單版)

  實現控制台版)

  連接埠掃描器大家都不陌生吧,用著別人的連接埠掃描器,雖說方便,但是如果能夠做一個,當然是一個賞心悅目的事。其實,實現自己的連接埠掃描器並不困難。而且原理也比較簡單,只要我們具備基礎的網路知識,明白tcp三向交握原則即可。
  C#提供一組網路編程的類,使網路編程更加簡單優美。其中,Socket封裝了大多數用於網路通訊的api,要實現連接埠掃描,我們只需使用Socket.Connect()方法。然後再判斷Socket.Connected是否為真,如果為真 ,則表明該連接埠可以串連,也就是說該連接埠是開放的。所以,判斷一個連接埠是否開放的代碼如下:

 1 public void ThreadFunc(object o) 
2    {
3    int port = (int)o;
4    ScanSocket s = new ScanSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
5    s.Port = port;
6    IPEndPoint ipport = new IPEndPoint(scanIP, port);
7    try
8    {
9    // s.BeginConnect(ipport, new AsyncCallback(EndConnect), s);
10    s.Connect(ipport);
11    if (s.Connected == true)
12    OnPortConnect(null, new ScanEventArg(s.Port));
13    }
14    catch (Exception e)
15    {
16   
17    }
18    finally
19    {
20    lock (this)
21    {
22    finishThreads++;
23    }
24    if (OnPortThreadFinish != null)
25    OnPortThreadFinish(null, null);
26    }
27    }

為了實現快速掃描,不可避免的要使用多線程的。我的實現的思路是,每個線程只掃描一個連接埠號碼。掃描完了再分配一個新的連接埠號碼。直到所有的連接埠號碼掃描完為止(不知道大家有沒有更好的方法呢)代碼如下:

 1 private void MainScan() 
2    {
3    if (!AdjustPortAndIP(ip,ref sport, ref eport))
4    {
5    if (OnPortError != null)
6    OnPortError(null, null);
7    return;
8    }
9    if (maxThreadCount > DEFAULT_THREAD_COUNT)
10    {
11    maxThreadCount = DEFAULT_THREAD_COUNT;
12    }
13    realThreadCount = 0;
14   
15    ScanThread st = new ScanThread();
16    st.ScanIP = this.scanIP;
17    st.OnPortConnect += new ScanHandler(st_OnPortConnect);
18    st.OnPortThreadFinish += new EventHandler(st_OnPortThreadFinish);
19    for (int i = sport; i <= eport; i++,realThreadCount++)
20    {
21    while (realThreadCount-st.FinishThreads > maxThreadCount)
22    {
23    Thread.Sleep(10);
24    }
25    Thread.Sleep(10);
26    ParameterizedThreadStart ps = new ParameterizedThreadStart(st.ThreadFunc);
27    Thread start = new Thread(ps);
28    start.Start(i);
29    }
30    while (st.FinishThreads != realThreadCount) Thread.Sleep(1000);//等到所有線程全退出為止
31    //Thread.Sleep(10000);
32    if (OnScanFinish != null) //通知用戶端掃描已經完成
33    OnScanFinish(null, null);
34    }

為了和客戶段進行互動,所以在ScanPort.cs裡定義了幾個事件:

1 public event EventHandler OnPortError; 
2    public event EventHandler OnScanFinish;
3    public event ScanHandler OnPortConnect;
4    public event EventHandler OnPortThreadFinish;

分別代表掃描已經完成,該連接埠是開的和該連接埠已經掃描完畢。好了,有這些基礎,相信實現自己的掃描器也不難了,具體實現參照原代碼。
  如何使用:先把scandll.dll添加到工程中,然後指定ip地址和連接埠號碼即可,代碼如下:
  scanPort.Scan(ip,sPort,ePort,threadCount);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.