C# 在多播上接收所有udp数据包

C# 在多播上接收所有udp数据包,c#,sockets,udp,multicast,udpclient,C#,Sockets,Udp,Multicast,Udpclient,我正在使用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.R

我正在使用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数据包丢失?

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

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

你为什么要进行
投票
睡眠
?由于
UdpClient.Receive
会一直阻塞到下一个数据报可用,因此您只需在循环中调用它。如果没有更多的数据接收,您会怎么做?套接字将永远阻塞。要停止接收数据,您只需关闭UdpClient,不是吗<代码>接收然后会以异常终止,我猜。是的,它会被终止并引发套接字异常,我们不希望这样。不要害怕异常。例外警察有他们的恐惧症,但你有一段代码不起作用,因为你本该读书的时候却在浪费时间睡觉。只需进行块读。