2012-05-10 8 views
4

はコードを考えてみましょう。この時間帯のメッセージは失われます。C#のUDPサーバは

まあ、私はいくつかの種類oのバッファーだと思いますが、バッファーが誰もメッセージを聞いていない時間がいっぱいになると、メッセージは失われます。

私は誰かが、これは同じエンドポイントに数回BeginReceiveを呼び出すことにより、非常に簡単に解決することができることを言って覚えていたので、私はこの試みた:

for(int x = 0; x < 5;x++) { 
     escuta.BeginReceive(new AsyncCallback(ReceiveCallback), e); 
    } 

奇妙なことに、同じソケット上で受信始まるん呼び出すことがないスローエラーをメッセージがすべて受信されるたびに、5つのbeginReceiveが発生し、5つのすべてが同じメッセージを受信します。

コードを改善する方法はありますか?

答えて

2

第1に、UDPを使用する際にすべてのデータを取得する保証はないため、コード/プロトコルのフォールトトレラントに関係なく行う必要があります。

処理が非常に集中していて、膨大な量のデータが氾濫していることが予想される場合を除き、おそらく別のことをする必要はありません。いくつかのエラー検出コードを追加するだけで、コードが対処できないかどうかを知ることができます。

ただし、受信ループを高速に保つ必要がある場合は、データを受信したときに別のスレッドが処理するキューにそのデータをコピーすると、すぐに再度読み取りを開始できます。または、いくつかの状況では、複数のパケットが連続して入ってくる場合にリエントラントを処理できるように、エンド受信を書き込むことができます。

+0

私は、プロトコルがUDPの場合は何も確信していませんが、私のコードのためにデータが失われることはありません。そして、私は大量のデータを期待しています。データはすでにキューにあり、別のスレッドはデータをディスクに書き込みます。私は最高のことを願っています。助けてくれてありがとう – uacaman

+0

別の考え方(あなたの状況に応じて飛行するかもしれない)は、複数のUDPポートをあなたのクライアントに公開して、読み込みワークロードをいくつかのスレッドに分けることができます。あなたがしていることがすべてデータをキューに引き渡すのであれば、これはあまり効果がないかもしれません。 –

関連する問題