在 C# 中接收 UDP 广播消息

Posted

技术标签:

【中文标题】在 C# 中接收 UDP 广播消息【英文标题】:Receiving UDP Broadcast message in C# 【发布时间】:2012-09-17 05:06:08 【问题描述】:

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

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

源目标长度

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

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

所以我想肯定有一些非常基本的东西我做错了。 谁能帮我吗?谢谢!

【问题讨论】:

你能贴出你用来监听数据包的代码吗? 我尝试了以下代码:codeidol.com/csharp/csharp-network/IP-Multicasting/… 和 java2s.com/Code/CSharp/Network/ReceiveBroadcast.htm 以及 ***.com/questions/746519/… 任何活动防火墙?我不确定 Wireshark 在哪里拦截了这些包,但可能是防火墙之后阻止了它们 不,我只使用 Windows 防火墙。在我开始测试之前它就被关闭了。 【参考方案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 之前从该套接字发送了一个广播数据包。 IE。在ReceiveFrom 调用之前添加这一行:

sock.SendTo(someData, new IPEndPoint(IPAddress.Broadcast, somePort))

当我没有先从接收套接字发送广播数据包时,它没有收到传入的广播数据包,即使它们出现在 Wireshark 中(数据包的目标是 255.255.255.255)。

我认为防火墙似乎正在处理传入的数据包(除非传出数据包首先打开某种 UDP 漏洞——尽管我之前没有听说过 UDP 打洞以某种方式适用于广播数据包),所以 我去了服务并完全禁用了 Windows 防火墙服务。这没有任何改变。

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

【讨论】:

【参考方案2】:

你没关系,他们在代码中存在一些导致问题的东西。 (没看过文章,直接复制粘贴)

它总是在本地机器上工作,但在远程机器上它会由于某种原因而失败。

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

sock.SendTo(data, iep1);  

它应该可以工作。

不知道为什么。

【讨论】:

以上是关于在 C# 中接收 UDP 广播消息的主要内容,如果未能解决你的问题,请参考以下文章

udp 能跨网段广播 谁能告诉我udp跨网段怎么发消息,比如192.168.2.1到192.168.13.2去 c#的

向所有可用的网卡广播 UDP 消息

Socket网络编程学习笔记 UDP案例-消息接收回送与局域网广播回送

在节点js中获取UDP的目标地址

如何从 UDP 消息中播放波形数据(c#)

如何在移动设备上的 Cordova 应用程序中接收 UDP 消息?