2012-01-19 12 views
1

私は常にUDPデータをリスンする必要のあるプログラムを作っています。C#UDPクライアントの使用

現在のアイデアでは、このメソッドを常に1つのスレッドで実行し、パケットをリスンしてから、他のスレッドで処理できるようにリストに追加します。主な問題は、受信したIPをリストに追加して他のスレッドが処理できるようにすることですが、処理中に受信したパケットを失う場合は、受信メソッドの使用を一時停止するかどうかわかりませんまたはデータをキューから取り込めるかどうかを確認します。

public void listen() 
{ 
    try 
    { 
     packetQueue.Add(receivingUdpClient.Receive(ref RemoteIpEndPoint)); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e.ToString()); 
    } 
} 

答えて

1

ネットワークトラフィックをネットワークカードにバッファリングして、一貫性のない状態でもデータが一致するようにする必要があります。あなたにもあることを合格する必要がありますので、IPの場合と同様に、あなたはエンドポイントからそれを得ることができます:あなたが間にできるだけ時間を欠場する場合

public void listen() 
    { 
     try 
     { 
      packetQueue.Add(receivingUdpClient.Receive(ref RemoteIpEndPoint), RemoteIpEndPoint); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 
    } 

は、私はあなたがBeginReceiveを使用して起動をお勧め受け取ります新しいBeginReceiveをコールバックに入れてから、受信したデータをコールバックで処理します。しかし、これはいくらかの同期の複雑さを追加します。

+0

最後の部分はとても良いアイデアです。 – Joel

1

私はUdpパケットからIPを取得する方法はわかりません。あなたはそれがエンドポイントを形成取得する必要があります:

byte[] receivedBytes = oClientListener.Receive(ref endPoint); 
IPAddress = endPoint.Address; 
PackQueue.Add(new PacketOfSomeType(receivedBytes, IPAdress)); 

また、あなたのプログラムは、すべてのパケットを失うを開始し、非常にゆっくりと実行する必要があります - 窓は限り、あなたのクライアントのリスナーが設定しているとして、あなたのためにそれらをバッファリングします!

+0

あなたはそれがバッファリングしているウィンドウであることは間違いありませんか?私はネットワークカードのバッファーを考えた – mtijn

+0

ああ、ええ、私はあなたの質問を読んで、私の答えを編集しました。 UdpClientが有効な限り、トラフィックはバッファされます。 – DanTheMan

+0

私はパフォーマンス面を軽視しません。 UDPパケットは、接続が不足しているため、高速かつ激しい(SQL Slammerと思われる)ことがあります。親切にしておくだけのもの。 –

関連する問題