2011-06-27 79 views
1

我正在嘗試確定遠程主機是否正在偵聽特定的UDP端口號。我這樣做(在C#),如下所示:Windows防火牆阻止ICMP端口無法訪問?

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
    int sent = socket.SendTo(bufsend, bufsend.Length, SocketFlags.None, endpoint); 
    int recv = socket.ReceiveFrom(bufrecv, ref endpoint); 

如果沒人在聽,我得到一個ICMP「端口不可達」,這是報告的接收與錯誤碼WSAECONNRESET套接字異常(10054)。所有這一切都有道理,但它只發生在Windows防火牆被禁用時。如果防火牆已啓用 - 即使我爲該程序設置了一個例外 - 我得到ErrorCode WSAETIMEDOUT(10060),大概是因爲防火牆已經吃掉了ICMP「端口不可達」。

有什麼建議嗎?我已經檢查過防火牆的「高級安全性」設置,但無濟於事。

謝謝...

+0

可以使用Windows防火牆中的自定義規則修復此問題,該規則將防火牆打開爲ICMP「目標不可達」消息(「端口不可達」是一種「目標不可達」 - 類型3,代碼3)。但要做到這一點,您必須將規則應用於所有程序,而不僅僅是實施SendTo/ReceiveFrom測試的可執行程序。 – Fred

回答

1

查看上面的評論。您必須將打開防火牆的規則應用到所有程序的「目標不可達」消息,而不僅僅是實施SendTo/ReceiveFrom測試的可執行文件。