首页 文章

在C#中接收UDP广播消息

提问于
浏览
6

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

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

来源目的地长度

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

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

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

2 回答

  • 1

    刚遇到同样的问题,想分享为我修复的问题 .

    简而言之:似乎Windows防火墙在某种程度上是造成这种奇怪行为的原因,只是禁用该服务并没有帮助 . You have to explicitly allow incoming UDP packets for specific program (executable) in Windows Firewall inbound rules list.

    有关完整的案例描述,请继续阅读 .

    我的网络设置是:我的(接收)机器的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 之前,这不起作用 unless I sent a broadcast packet from that socket . 即在 ReceiveFrom 之前添加此行:

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

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

    我认为看起来好像防火墙正在搞乱传入的数据包(除非首先通过传出数据包打开某种UDP漏洞 - 即使我之前没有听说UDP漏洞以某种方式应用于广播数据包),所以 I went to services and disabled Windows firewall service altogether. This changed nothing.

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

  • 0

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

    它始终可以在本地计算机上运行,但是从远程计算机上它会因某些原因而失败 .

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

    sock.SendTo(data, iep1);
    

    它应该工作 .

    不知道为什么 .

相关问题