You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UDP发现代码无法接收UDP广播:Xamarin发广播桌面端监听卡住

UDP广播接收失败解决方案

核心问题及修复步骤

  • 修正监听端绑定地址
    监听时绑定192.168.1.255属于错误配置,UdpClient需要绑定本地网卡的地址来接收数据,直接使用你注释掉的IPAddress.Any即可监听所有本地网卡的对应端口流量。
  • 确认端口一致性
    Xamarin端发送目标端口为11000,需要确认桌面端listenPort变量值同样为11000,端口不匹配会直接丢弃收到的数据包。
  • 开启Xamarin端Socket广播权限
    系统默认禁止Socket发送广播包,需在发送数据前添加配置:s.EnableBroadcast = true;,否则广播包会被系统直接拦截,无法实际发送到网络中。
  • 网络与防火墙排查
  1. 确认手机和桌面设备连接同一WiFi,且均处于192.168.1.0/24网段
  2. 暂时关闭桌面端系统防火墙测试,或手动添加入站规则允许该应用使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:57:04