刚刚遇到同样的问题,并想分享为我解决的问题。
简而言之:Windows防火墙似乎是导致这种奇怪行为的原因,只是禁用该服务无济于事。您必须在 Windows 防火墙入站规则列表中明确允许特定程序(可执行文件)的传入 UDP 数据包。
有关完整的案例描述,请继续阅读。
我的网络设置是:我的(接收)机器的IP是192.168.1.2,发送机器的IP是192.168.1.50,两台机器的子网掩码都是255.255.255.0。我的机器运行的是 Windows 7 x64。
这是我使用的代码(大致):
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);
sock.Bind(iep);
sock.EnableBroadcast = true;
EndPoint ep = (EndPoint)iep;
byte[] buffer = new byte[1000];
sock.ReceiveFrom(buffer, ref ep);
最初这不起作用,除非我在调用它之前从该套接字发送了一个广播数据包ReceiveFrom
。即在调用之前添加此行ReceiveFrom
:
sock.SendTo(someData, new IPEndPoint(IPAddress.Broadcast, somePort))
当我没有先从接收套接字发送广播数据包时,它没有收到传入的广播数据包,即使它们出现在 Wireshark 中(数据包的目标是 255.255.255.255)。
我认为防火墙似乎正在处理传入的数据包(除非传出数据包首先打开某种 UDP 漏洞——尽管我之前没有听说过 UDP 打洞以某种方式适用于广播数据包),所以我去了服务并完全禁用了 Windows 防火墙服务。这没有任何改变。
但是,在尝试了其他所有方法之后,我重新启用了防火墙服务,并尝试再次运行该程序。这一次,出现了防火墙提示,询问我是否要允许 MyProgram.vshost.exe 进程(我在 Visual Studio 中调试)通过防火墙,我接受了它,瞧——一切正常!现在正在接收传入的数据包!