2012-11-25 134 views
0

我試圖創建在C#端口掃描器,到目前爲止,我有這樣的:加快端口掃描C#

private void ip() 
{ 
    int start = 70; 
    int end = 80; 
    string ipString; 
    if (this.comboBox1.Text == "Domain") { 
     ipString= Dns.GetHostEntry(txtHost.Text).AddressList[0].ToString(); 
    } 
    else { 
     ipString = txtHost.Text; 
    } 
    TcpClient asd = new TcpClient(); 
    // MessageBox.Show(ipString);  
    IPAddress address = IPAddress.Parse(ipString); 
    for (int i = start; i <= end; i++) 
    { 
     try 
     { 
      asd.SendTimeout = 3000; 
      asd.ReceiveTimeout = 3000; 
      asd.Connect(address, i); 

      if (asd.Connected) 
      { 
       MessageBox.Show("Port " + i + " is open"); 
      } 
     } 
     catch 
     { 
      MessageBox.Show("Port " + i + " is closed"); 
     } 
    } 
} 

然而,對於關閉的端口,它有點慢,約20秒,我應該怎麼做才能讓該過程更快? 非常感謝。

+1

「它有點慢」。你應該測量哪個位慢,所以我們不必猜測。 – spender

+0

也許相關:http://stackoverflow.com/questions/1331902/c-sharp-tcp-port-scanner-resources – rene

+0

你應該考慮異步網絡API。有很多可供選擇的,但如果您重視您的理智,請考慮.net4.5和async/await apis。另外值得考慮的是.net DNS apis沒有任何好處。也許可以考慮第三方選項。請參閱:http://stackoverflow.com/questions/11480742/dns-begingethost-methods-blocking – spender

回答

1

您應該使用線程。

http://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx

火上,要檢查,讓回調的每一個端口單獨的線程通知你這人是開着的,哪些不是。

+1

如何使用多個參數調用線程? 私人無效IP(嚴格ip,int開始,int結束) { } ? – user1815324

+3

當你甚至不知道哪一部分「有點慢」時,你如何提出這個建議?添加額外的線程很少是加速網絡代碼的好答案。 – spender

+1

線程將在任何情況下被需要,因爲他的代碼會阻止主UI線程,不管他做了什麼。網絡代碼需要線程化。 –

0

你應該有你的委託,並宣稱這樣的異步功能(例如,在兩個參數)

public delegate void UpdateUIThreadDelegate(int par1, int par2); 
void UpdateUIThread(int par1, int par2) 
{ 
     ... 
} 

而且你應該叫你異步函數是這樣的:

this.Invoke(new UpdateUIThreadDelegate(UpdateUIThread), new object[] { par1, par2 }); 
0

您需要關閉在完成測試後連接。

嘗試asd.Close();在您的catch聲明結束時。

它顯着加快了我的過程。