0

我设置了一个非常简单的 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 秒的延迟。接收代码似乎没有造成这种延迟,它已经在那里了。我不明白。

4

1 回答 1

1

在我看来,通过使用 .Net 异步 I/O,您放弃了对发送时间的控制。我不知道这个异步设施中内置了什么样的延迟,但我的猜测是涉及一些后台线程池并且这些线程正在轮询一些输入队列。

我会尽量避免所有这些开销,只处理在同一个线程中发送。UDP 非常简单,只需发送和忘记,尤其是在处理单个套接字时。我认为这里不需要异步 I/O 开销。

于 2011-08-05T12:44:53.260 回答