我設置了一個非常簡單的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秒的延遲。接收的代碼似乎不會延遲這個延遲,它已經準備好了。我沒有明白。
用wireshark(http://www.wireshark.org/)看看網絡上發生了什麼,發佈你的代碼。 –
是否按預期發送消息(即低延遲)?或者它們在Wireshark中「波濤洶涌」?如果是,那麼發送的代碼是不好的。如果他們不是,那麼接收的代碼是不好的。 –
Wireshark中的列表似乎也在小時間間隔(〜0.2秒)內得到更新,但是我的消息在WS和接收器中肯定更加流暢。發送代碼運行速度快,流暢。但我沒有看到接收代碼有什麼問題。沒有太多的代碼。 –