刚刚经历过同样的问题,并且想分享一下为我解决的问题。
简而言之:看起来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中进行调试),我接受了它,并且瞧 - 一切正常!传入的数据包正在被接收!
来源
2014-03-05 23:52:33
lxa
你可以发布你用来侦听数据包的代码吗? – tomasmcguinness
我尝试了以下代码:http://codeidol.com/csharp/csharp-network/IP-Multicasting/What-Is-Broadcasting/和http://www.java2s.com/Code/CSharp/Network/ReceiveBroadcast。 HTM和也http://stackoverflow.com/questions/746519/udpclient-receive-on-broadcast-address – Boris
任何主动防火墙?我不确定Wireshark截取哪些软件包的位置,但可能是因为防火墙会阻止它们。 – Default