2015-04-26 80 views
0

我試圖創建基於this question的UDP端口檢查器,但是當在端口範圍1-100上測試(例如)www.google.com時,我會爲每個端口收到「連接嘗試因爲連接方在一段時間後沒有正確響應,或者由於連接的主機未能響應而建立連接失敗「。以下是我測試端口的代碼:檢查遠程UDP套接字

try { 
     UdpClient udpClient = new UdpClient(Port); 
     Socket uSocket = udpClient.Client; 
     uSocket.ReceiveTimeout = 5000; 
     uSocket.Connect(Adress, Port); 
     udpClient.Connect(Adress, Port); 
     IPEndPoint RemoteIpEndPoint = new IPEndPoint(Adress, Port); 
     Byte[] sendBytes = Encoding.ASCII.GetBytes("?"); 
     udpClient.Send(sendBytes, sendBytes.Length); 
     Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint); 
} catch (SocketException e) { 
     if (e.ErrorCode == 10054) { 
      return false; 
     } else { 
      return false; 
     } 
} 
return true; 
+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

1

UDP是無連接協議。由於您沒有收到錯誤10054(明確指示端口已關閉)但確實得到了一個TimeoutException,因此您應該假定該端口已打開,但遠程主機並不在意發送任何對您的確認信息。但是,如果路由器或防火牆正在過濾該端口,您還將獲得TimeoutException。由於UDP是無連接的,因此無法知道。快速參考:

得到了迴應? 港口開放。

得到SocketException錯誤10054? 港口關閉。

得到了TimeoutException?如果您和目標之間存在防火牆或NAT路由器,則可能會過濾端口(實際上已關閉)。如果您確定無法過濾UDP流量,則端口爲,並打開

另請參閱the Wikipedia page on UDPconnectionless communication

+0

我從來沒有得到任何重播,基於此我應該考慮所有測試的端口都關閉,但我知道的事實,例如端口80是開放的,但它仍然不會迴應給我。 – user3290117

+0

@ user3290117 Web服務器偵聽** TCP **端口80.我不認爲Google公開任何UDP服務。 TCP和UDP是完全不同的協議,如果使用TCP而另一個使用UDP,則同一臺機器上的兩個服務可以使用相同的端口號。 –

+0

謝謝你的回答我以爲這是端口80上的UDP,這就解釋了一切。 – user3290117