gpt4 book ai didi

c# - 在 C# 中接收 UDP 广播消息

转载 作者:太空狗 更新时间:2023-10-29 21:58:44 28 4
gpt4 key购买 nike

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

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

源目标长度

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

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

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

最佳答案

刚遇到同样的问题,想分享为我修复它的方法。

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

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

关于c# - 在 C# 中接收 UDP 广播消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12587051/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com