2012-01-24 102 views
1

我創建一個小工具,它讓我檢查這樣的指定IP和端口號端口的狀態:端口掃描:如何使掃描更快?

private void ScanPort(IPAddress address, int port) 
{ 
    using (TcpClient client = new TcpClient()) 
    { 
     try 
     { 
      client.Connect(address, port); 
      txtDisplay.AppendText("Port: " + nudFrom.Value.ToString() + 
       " is open." + Environment.NewLine); 
     } 
     catch (SocketException) 
     { 
      txtDisplay.AppendText("Port: " + nudFrom.Value.ToString() + 
       " is closed." + Environment.NewLine); 
     } 
    } 
} 

的問題是,當端口是開放的大約需要一秒鐘來檢查,如果端口關閉的過程大約需要20秒的時間。

如何更快地檢查打開/關閉端口?

+0

因爲拋出和捕捉異常很慢。如果你可以避免使用控制流的異常,你可能會解決速度問題。 –

+0

@Cody Gray,當port打開時只是爲了使用client.connected,但是我不確定如何避免try/catch,因爲如果port被關閉,它會拋出一個異常。 – HelpNeeder

回答

2

一種選擇是使用SharpPcap或Pcap.NET等原始套接字來實現此功能,並捕獲ICMP失敗響應。更簡單的方法是研究減少超時。 Here關於如何去做的一些想法。 Here是一個相關的問題,可能也有幫助。

如果您正在嚴格尋找提高您發佈的代碼性能的方法,那麼您可能會考慮在嘗試連接之前對該地址進行ping操作(假設這與您之前關於ARP'ing遠程主機的問題有關),並且由於字符串是不可變的,所以+運算符通常比使用諸如String.Format之類的東西要慢。這些建議不會削減你的處理的秒數(實際上你可能無法區分)。

+0

我確實找到了一個合理的答案,關於您建議查看的SO問題。現在我正試圖專注於我知道啓動並正在運行的IP,並嘗試着去檢查端口。一個問題是。我使用了'result.AsyncWaitHandle.WaitOne(1000,true)',但我不確定我應該如何設置超時時間以達到合理的響應時間,您會提出什麼建議? – HelpNeeder

+0

這不是我所指的超時。套接字連接超時也會影響您的性能。這基本上是您的應用程序在將控制權返回給您的應用程序之前等待ACK(我認爲這是正確的)數據包的時間。您可以從連接異步運行中受益,只需等待適用於您的應用程序的時間,而不是等待套接字超時。提供的第一個鏈接包括我所指的一個例子。 –

+0

這種或那種方式指向正確的方向。所以基本上我需要在嘗試進行任何連接時計算超時時間。感謝m8。 – HelpNeeder

1

我創建了一個像這樣的工具來ping網絡上的所有IP地址並獲得響應。

我使用.net 4.0並行/ foreach功能爲此。它顯着提高了性能。

+0

你介意分享一些源代碼嗎? – HelpNeeder

+0

@HelpNeeder - 如果你正在尋找代碼,你可以嘗試在右上角的小搜索框(http://stackoverflow.com/questions/2114266/convert-ping-application-to-multithreaded-version-to-增加速度c-sharp) –

+0

@ M.Babcock,謝謝,我會讀一讀。 – HelpNeeder