【发布时间】:2011-06-27 16:25:49
【问题描述】:
我正在尝试确定远程主机是否正在侦听特定的 UDP 端口号。我这样做(在 C# 中)如下:
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“无法访问的端口”。
有什么建议吗?我检查了防火墙的“高级安全”设置,但无济于事。
谢谢...
【问题讨论】:
-
可以使用 Windows 防火墙中的自定义规则来解决此问题,该规则将防火墙打开到 ICMP“无法访问的目标”消息(“无法访问的端口”是一种“无法访问的目标” - 类型 3,代码 3)。但要做到这一点,您必须将规则应用于所有程序,而不仅仅是实现 SendTo / ReceiveFrom 测试的可执行文件。
标签: c# udp windows-firewall