2011-08-01 22 views
0

私は非常に単純なUdpClientをセットアップして、できるだけ早く8バイトのデータを受信しました。クライアントはデータを非常に高速に送信していますが、サーバーは約0.5秒の非常に不安定な間隔でデータを受信して​​います。それは受信時に停止し、突然10行ほどのデータグラムを非常に高速に受信し、再び約0.5秒間停止します。何が問題なの?アイブ氏は、ファイアウォールをオフにしようとしたが、それは助けていませんでし...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)); 
    } 

_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 

このコードは、継続的に蓄積されたバッファを送信しています

私は今は非常に原始的なコードを知っていますが、少なくとも例外を投げてはいません...

IveはWiresharkでチェックしましたが、探しているものが正確ではありません。 UDPメッセージは問題なく送信されます。

アイブ氏は、できるだけ速く送るUDPを絞るとしないようにその良いアイデアをお読みください。私はそれを目立つ違いなしに試しました。送信は遅くなりますが、受信は前と同じように不安定である/バースト的です。

クライアントと受信者の両方が同じdev-machine(Windows 7)にあります。


ここでは、受信コール間の時間を測定した結果を示します。あなたはそれがすべての30回の反復約1秒間動けなく見ることができるように:

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に表示されたときには約1秒ごとにudp-firingの約1秒の遅延があります。受信コードはこの遅延を抱えているようには見えない、それはすでにそこにある。理解できません。

+0

wireshark(http://www.wireshark.org/)でネットワーク上で起こっていることを見て、コードを投稿してください。 –

+0

メッセージは期待どおりに送信されますか(つまり、待ち時間が短い)?それとも、Wiresharkで彼らは「不安定」ですか?そうであれば、送信コードが悪いです。そうでない場合、受信コードが悪いです。 –

+0

Wiresharkのリストは小さな間隔で更新されているようです(約0.2秒)が、私のメッセージは受信機ではWSの方がはるかに流動的です。送信コードは速くて流動的でもあります。しかし、私は受け取ったコードに何が間違っているのか分かりません。あまりコードはありません。 –

答えて

1

は、.NET非同期を使用してI/Oを使用すると、送信タイミングの制御を配っているように私には思えます。私はどのような遅延がこの非同期機能に組み込まれているのかわかりませんが、私の推測では、いくつかのバックグラウンドスレッドプールが関与していて、それらのスレッドがいくつかの入力キューをポーリングしていると思います。

私はすべてのことのオーバーヘッドを回避しようとちょうど同じスレッドに送信することに対処すると思います。 UDPは非常にシンプルです。特に、単一のソケットを扱う場合は、送信して忘れてしまいます。ここでは、非同期のI/Oオーバーヘッドは必要ないと思います。

関連する問題