C# 在多播上接收所有udp数据包
我正在使用c#UdpClient(代码中的客户端)接收多播组上的数据。 在while循环中,会发生以下情况: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
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,不是吗<代码>接收然后会以异常终止,我猜。是的,它会被终止并引发套接字异常,我们不希望这样。不要害怕异常。例外警察有他们的恐惧症,但你有一段代码不起作用,因为你本该读书的时候却在浪费时间睡觉。只需进行块读。