2011-08-01 208 views
0

我设置了一个非常简单的UdpClient以尽可能快地接收8个字节的数据。客户端发送数据的速度非常快,但服务器以大约0.5秒的非常不连续的间隔接收数据。它在接收时停止,然后突然以非常快的速度接收大约10个数据报,然后再次停止约0.5秒,依此类推。这里可能是什么问题?香港专业教育学院试图关闭防火墙,但它并没有帮助...Udp Socket稳定发送,突发接收

客户:

_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触发都会有1秒的延迟。接收的代码似乎不会延迟这个延迟,它已经准备好了。我没有明白。

+0

用wireshark(http://www.wireshark.org/)看看网络上发生了什么,发布你的代码。 –

+0

是否按预期发送消息(即低延迟)?或者它们在Wireshark中“波涛汹涌”?如果是,那么发送的代码是不好的。如果他们不是,那么接收的代码是不好的。 –

+0

Wireshark中的列表似乎也在小时间间隔(〜0.2秒)内得到更新,但是我的消息在WS和接收器中肯定更加流畅。发送代码运行速度快,流畅。但我没有看到接收代码有什么问题。没有太多的代码。 –

回答

1

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

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