我设置了一个非常简单的 UdpClient 来尽可能快地接收 8 个字节的数据。客户端发送数据的速度非常快,但服务器以大约 0.5 秒的非常不稳定的间隔接收数据。它在接收时停止,然后突然以非常快的速度连续接收大约十个数据报,然后再次停止约 0.5 秒,依此类推。这里可能是什么问题?我试过关闭防火墙,但它没有帮助......
客户:
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
此代码不断发送累积缓冲区:
if (!_sending)
{
_sending = true;
SocketAsyncEventArgs args = new SocketAsyncEventArgs();
args.Completed += (s2, e2) => { _sending = false; };
args.RemoteEndPoint = new IPEndPoint(IPAddress.Parse("192.168.0.100"), 14123);
args.SetBuffer(buffer, 0, buffer.Length);
_socket.SendToAsync(args);
}
服务器:
UdpClient udp = new UdpClient(new IPEndPoint(IPAddress.Parse("192.168.0.100"), 14123));
IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 0);
while (true)
{
byte[] buffer = udp.Receive(ref endpoint);
int x = BitConverter.ToInt32(buffer, 0);
int y = BitConverter.ToInt32(buffer, 4);
Console.WriteLine(string.Format("Receiving x={0}, y={1} @ {2}", x, y, DateTime.Now.Ticks));
}
我现在知道它非常原始的代码,但它至少没有抛出任何异常......
我已经检查过 Wireshark,但我不确定要寻找什么。UDP 消息可以正常发送,没有打嗝。
我已经阅读了限制 UDP 而不是尽可能快地发送的好主意。我确实尝试过,没有任何明显的区别。发送速度较慢,但接收与以前一样大块/突发。
客户端和接收器都在同一台开发机器上(Windows 7)。
这是测量接收呼叫之间的时间的一些输出。如您所见,它大约每 30 次迭代就会卡住一秒钟:
1,0180582
0,001
0
0
0,0010001
0
0
0
0
0,0010001
0
0
0
0
0
0
0
0
0
0
0,0010001
0
0
0
0
0
0,0010001
1,0170582
ETC
更新
看起来延迟是在缓冲区发送后出现的。发送代码似乎非常快速/流畅地发送缓冲区,但是当它们出现在 Wireshark 中时,它们大约每秒钟的 udp 触发都有 1 秒的延迟。接收代码似乎没有造成这种延迟,它已经在那里了。我不明白。