我在基于 C# .NET 套接字的应用程序的发送端运行了这段代码:
const int port = 1110;
System.Net.Sockets.UdpClient udp = null;
udp = new System.Net.Sockets.UdpClient(host, port);
...
byte[] data = m.Serialize();
udp.Send(data, data.Length);
我在接收端运行了这段代码:
System.Net.IPEndPoint replyAddress = new System.Net.IPEndPoint(
System.Net.IPAddress.Any, port);
while ((udp != null) && (udp.Available > 0))
{
...
}
我在 UDP 端口 1110 的接收端添加了一个例外(Windows 7)防火墙。但是,除非我完全禁用防火墙,否则接收端代码永远不会进入 while 循环。为什么1110端口异常不生效?使用 Microsoft 网络监视器,我可以看到试图进入端口 1110 的消息,其描述如下UDP:SrcPort = 1082, DstPort = 1110, Length = 11
(我认为网络监视器会看到本地网络上的所有消息,而不仅仅是那些通过防火墙并发往本地系统的消息),但是除非我完全禁用防火墙,否则我的应用程序永远不会收到它们。
我怎样才能弄清楚这里发生了什么或修复它?我可以在循环内设置断点,让对方发送数据,当我禁用防火墙的那一刻,我命中了断点,所以我知道流量可以通过,但是防火墙的某些东西阻止了它。我的防火墙异常如下所示:
一般的
- 启用:真
- 行动:允许连接
计划和服务
- 所有满足指定条件的程序
- 适用于所有计划和服务
电脑
- (未选中且为空)仅允许来自这些计算机的连接
- (未选中且为空)跳过此规则以获取来自这些计算机的连接
协议和端口
- 协议类型:UDP
- 协议编号:17
- 本地端口:特定端口
- 端口:1110
- 远程端口:所有端口
范围
- 本地IP地址:任何IP地址
- 远程IP地址:任何IP地址
先进的
- 指定适用此规则的配置文件:域、私有、公共(全部选中)
- 边遍历:允许边遍历
用户
- 授权用户:(未选中且为空)仅允许来自这些用户的连接
- 例外:(未选中且为空)为来自这些用户的连接跳过此规则