【问题标题】:receive all udp packets on multicast在多播上接收所有 udp 数据包
【发布时间】:2012-12-29 08:28:25
【问题描述】:

我正在使用 c# UdpClient(代码中的客户端)来接收多播组上的数据。 在 while 循环中会发生以下情况:

while(receiving)
    //First i check if data is available, polltime = 100ms
    if(client.Client.Poll(polltime, SelectMode.SelectRead))
    {
        //if data is present 
        data = client.Receive(ref remoteEp);
        ...
    }
    else
    {
        //100ms
        Thread.sleep(sleeptime);
    }

不知何故,我经常错过应该在多播上的数据包(如果有多个),我猜 udp 数据包丢失不会那么多。 接收可以做得更好还是有人知道问题)

编辑1: 发送的数据也是c# UdpClient,大小为1024的字节数组

编辑2: 在 Wireshark 中我可以看到丢失的数据包没有到达,所以问题可能真的是 udp 数据包丢失?

【问题讨论】:

  • 你为什么要做PollSleep?由于UdpClient.Receive 阻塞直到下一个数据报可用,您应该简单地循环调用它。
  • 如果没有收到更多的数据,你会怎么做?套接字将永远阻塞。
  • 要停止接收数据,您只需Close UdpClient,不是吗? Receive 然后会以异常终止,我猜。
  • 是的,它将被终止并引发套接字异常,我们不希望这样。
  • 不要害怕异常。例外警察有他们的恐惧症,但你有一段代码不起作用,因为你在浪费时间睡觉,而你应该阅读。只需进行阻塞读取即可。

标签: c# sockets udp multicast udpclient


【解决方案1】:

我建议接收循环的以下实现:

while (receiving)
{
    try
    {
        // block until data is present
        data = client.Receive(ref remoteEp);
        ...
    }
    catch (SocketException ex)
    {
        receiving = false;
    }
}

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 2022-11-02
    • 2019-05-31
    • 1970-01-01
    • 2018-04-05
    • 2015-11-28
    • 2011-03-02
    相关资源
    最近更新 更多