UDP发现代码无法接收UDP广播:Xamarin发广播桌面端监听卡住
UDP广播接收失败解决方案
核心问题及修复步骤
- 修正监听端绑定地址
监听时绑定192.168.1.255属于错误配置,UdpClient需要绑定本地网卡的地址来接收数据,直接使用你注释掉的IPAddress.Any即可监听所有本地网卡的对应端口流量。 - 确认端口一致性
Xamarin端发送目标端口为11000,需要确认桌面端listenPort变量值同样为11000,端口不匹配会直接丢弃收到的数据包。 - 开启Xamarin端Socket广播权限
系统默认禁止Socket发送广播包,需在发送数据前添加配置:s.EnableBroadcast = true;,否则广播包会被系统直接拦截,无法实际发送到网络中。 - 网络与防火墙排查
- 确认手机和桌面设备连接同一WiFi,且均处于192.168.1.0/24网段
- 暂时关闭桌面端系统防火墙测试,或手动添加入站规则允许该应用使用UDP 11000端口
- 显示优化
你发送的是二进制字节数据,接收端不要用ASCII转字符串输出,直接打印十六进制值更便于验证数据正确性。
修正后代码示例
Xamarin发送端
private void StartUdpDiscovery() { Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); s.EnableBroadcast = true; // 开启广播发送权限 IPAddress broadcast = IPAddress.Parse("192.168.1.255"); IPEndPoint ep = new IPEndPoint(broadcast, 11000); byte[] data = new byte[2]; data[0] = 0x0A; data[1] = 0x60; s.SendTo(data, ep); Console.WriteLine("广播包已发送"); s.Close(); // 释放Socket资源 }
桌面监听端
private void StartUdpListener() { const int listenPort = 11000; // 和发送端端口保持一致 UdpClient listener = new UdpClient(listenPort); IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort); // 监听所有本地接口 try { while (true) { Console.WriteLine("等待广播包..."); byte[] bytes = listener.Receive(ref groupEP); Console.WriteLine($"收到来自 {groupEP} 的广播:"); Console.WriteLine($"数据内容:{bytes[0]:X2} {bytes[1]:X2}"); } } catch (SocketException e) { Console.WriteLine($"Socket异常:{e}"); } finally { listener.Close(); } }
内容的提问来源于stack exchange,提问作者Stout
相关产品推荐
相关产品推荐

