在C#中接收UDP广播消息

6
我知道这个问题已经被问了很多次。我已经阅读了所有的答案并尝试了所有能找到的代码。几天后,我非常绝望,不得不向您求助。
我在家庭网络中有一个设备和一台电脑。该设备发送UDP广播消息。在我的电脑上,我可以在wireshark中看到这些消息:
源地址 目的地址 长度 192.168.1.102 0.0.0.0 UDP 60 源端口:9050 目标端口:0
这意味着数据包已经到达我的电脑。我的下一步是创建一个接收这些数据包的C#应用程序。如上所述,我尝试了每一个可能的解决方案,但它就是无法接收任何东西。
所以我想我一定做错了一些非常基本的事情。 有人能帮帮我吗?谢谢!

1
你能否发布一下你用来监听数据包的代码? - Tomas McGuinness
我尝试了以下代码:http://codeidol.com/csharp/csharp-network/IP-Multicasting/What-Is-Broadcasting/,http://www.java2s.com/Code/CSharp/Network/ReceiveBroadcast.htm以及https://dev59.com/lnRB5IYBdhLWcg3wAjXR。 - Boris
有任何活动的防火墙吗?我不确定Wireshark拦截数据包的位置,但可能是防火墙之后停止它们。 - default
不,我只使用Windows防火墙。而且在我开始测试之前就关闭了它。 - Boris
2个回答

2

我遇到了同样的问题,想分享一下是如何解决的。

简单来说:似乎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中调试)通过防火墙,我接受了它,然后 - 一切正常!现在可以接收传入数据包了!

0

你没问题,他们在代码中有一些奇怪的东西导致了这个问题。(我没有阅读文章,只是复制粘贴)

它总是在本地机器上运行正常,但从远程机器上运行时会出现某种原因的失败。

修复方法如下: 在Broadcst.cs文件中,他们广播两次。一次是给本地主机,然后是给目标IP地址(iep2)。只需删除

sock.SendTo(data, iep1);  

它应该可以工作。

不知道为什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接