2011-08-01 262 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開銷。