在C#中接收UDP广播消息

时间:2012-09-25 16:19:32

标签: c# udp broadcast wireshark udpclient

我知道这个问题已被多次询问过。我已经阅读了所有答案并尝试了一些我能找到的代码。几天后,我非常绝望,我不得不向你寻求帮助。

我的家庭网络中有一台设备和一台PC。设备发送UDP广播消息。在我的电脑上,我可以在wireshark中看到这些消息:

来源目的地长度

192.168.1.102 0.0.0.0 UDP 60源端口:9050目标端口:0

这意味着数据包到达我的电脑。我的下一步是创建一个接收这些数据包的C#应用​​程序。如上所述,我尝试了所有可能的解决方案,但它不会收到任何东西。

所以我想我必须有一些非常基本的错误。 谁能帮我吗?谢谢!

2 个答案:

答案 0 :(得分:1)

刚刚遇到同样的问题,并希望分享为我修复的问题。

简单地说:似乎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漏洞以某种方式应用于广播数据包),所以< strong>我去了服务并完全禁用了Windows防火墙服务。这没有任何改变。

然而,在尝试其他所有内容后,我重新启用了防火墙服务,并尝试再次运行该程序。这一次,防火墙提示出现问我是否要通过防火墙允许MyProgram.vshost.exe进程(我在Visual Studio中调试),我接受了它,瞧 - 一切正常!现在正在收到传入的数据包!

答案 1 :(得分:0)

你没关系,他们在代码中有一些连线导致问题。 (我没看过文章,只是复制粘贴)

它总是在本地计算机上运行,​​但是从远程计算机上它会因某种原因而失败。

解决这个问题: 在Broadcst.cs中,他们播放了两次。一次用于localhost,然后用于目标IP地址(iep2)。只需删除

即可
sock.SendTo(data, iep1);  

它应该有用。

不知道为什么。