Udp Socket稳定发送,突发接收

时间:2011-08-01 10:20:11

标签: .net sockets udp datagram

我已经设置了一个非常简单的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

更新

看起来缓冲区发送后会出现延迟。发送代码似乎非常快速/流畅地发送缓冲区,但是当它们出现在Wireshark中时,它们在udp-firing的每一秒都有1秒的延迟。接收代码似乎没有出现这种延迟,它已经存在。我不明白。

1 个答案:

答案 0 :(得分:1)

在我看来,通过使用.Net异步I / O,您可以放弃对发送时序的控制。我不知道这个异步工具是什么类型的延迟,但我的猜测是涉及到一些后台线程池,并且这些线程正在轮询一些输入队列。

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