【问题标题】:C# UDP multicast receive not working (async or sync)C# UDP 多播接收不起作用(异步或同步)
【发布时间】:2020-07-30 01:37:43
【问题描述】:

我正在为我正在开发的应用程序添加多播侦听功能。在某些情况下,我要连接的设备每秒都会发送一个多播数据包,我希望用户能够监听该数据包(如果它正在发送)。

我可以看到使用 Wireshark 的设备不断发送多播数据包,因此我知道它们存在并且我知道我正在使用正确的多播组和端口号。我已经尝试了十几种不同的方法来让我的应用程序捕获数据包,但没有任何运气。如果我从应用程序本身发送一个测试多播数据包,它接收它没有问题。我尝试接收异步和同步的数据包,没有变化。我真的很难过这个,不知道我做错了什么。我发现的每一个例子都让我相信这应该是可行的。

我的多播 udp 侦听器类:

   class MulticastClient
{
    private UdpClient client;
    private IPEndPoint localEp;
    private IPAddress multicastAddress;

    public byte[] receivedData { get; private set; }

    public MulticastClient(string multicastIP, int port)
    {
        localEp = new IPEndPoint(IPAddress.Any, port);
        client = new UdpClient(AddressFamily.InterNetwork);

        client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
        client.ExclusiveAddressUse = false;

        client.Client.Bind(localEp);

        this.multicastAddress = IPAddress.Parse(multicastIP);
        client.JoinMulticastGroup(this.multicastAddress);            
    }

    public async Task Listen()
    {
        UdpReceiveResult result = await client.ReceiveAsync();
        receivedData = result.Buffer;    
    }
}

启动它的按钮点击:

MulticastClient client = new MulticastClient("239.255.0.1", 32768);

        await Task.Run(async () =>
        {
            await client.Listen();
        });

        byte[] receivedData = client.receivedData;

        if (receivedData != null)
        {
            //Here I display useful information about the packet to the user
        }

这是一个数据包捕获的 sn-p,显示了我似乎无法接收的多播数据包: Wireshark packet capture

【问题讨论】:

  • 您希望如何获得以下代码行:byte[] receivedData = client.receivedData;?你永远坐在上面的任务中。转到 Debug Break All 并查看代码在哪里运行。
  • @jdweng 你说得对,那是我尝试使用同步方法接收时剩下的。自从我使用 await 以来,它永远不会达到这一点。
  • @jdweng 我尝试了太多不同的东西。我在删除了 while(true) 的情况下进行了编辑,即使我可以在 Wireshark 上看到它们传入,仍然永远不会收到数据包。
  • 在receiveData上放一个断点。你到那里了吗?如果您按 F11,您会进入下一条指令吗?如果将鼠标悬停在 receivedData 上,它是 null 还是包含字节?
  • @jdweng 如果我手动发送一个测试多播数据包,我会到达这一点,如果我让它尝试接收我在 wirehark 上看到的数据包,它会在 UdpReceiveResult result = await 客户端上永远等待。 ReceiveAsync();

标签: c# async-await multicast udpclient


【解决方案1】:

使用this post. 的变体使其工作

@jdweng 让我意识到,当他/她询问多个适配器时,我有几个虚拟 NIC 用于可能加入 ht 多播组的 VM,而不是我的实际硬件 NIC。

【讨论】:

  • 您有机会发布解决方案。我遇到了多播问题,在 nexus 5 上一切正常,在像素 3 上它根本不工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 2015-01-26
  • 1970-01-01
相关资源
最近更新 更多