1

読み取りの間にドロップされたパケットに関係なく、最新の受信 UDP パケットを読み取る必要があります。着信パケットは、アプリケーションの最大処理速度の 3 倍の速さで入ってきます。これを実現するためにsetReceiveBufferSize(int size)、Java のDatagramSocketクラスを使用SO_RCVBUFして、予想されるパケットと同じサイズ (バイト単位) に設定しました。

ただし、最新のパケットを取得する前に、まだ 3 パケットの遅延があります (着信速度が受信速度の 10 倍の場合、10 パケットの遅延があります)。SO_RCVBUFこれは、最新のパケット以上のものを含むことを示唆しています。

まず、単位はsetReceiveBufferSize(int size)バイトですか?javadocsには明示的に記載されていません。SO_RCVBUF次に、最新の着信パケットのみを受信するように無効にする方法はありますか? たとえば、ゼロは関数の引数として正しくありませんが、理論的には受信バッファー サイズを 1 に設定できます。

4

2 に答える 2

1

これは異常な問題のようです ;)

アプリケーションを別々のスレッドに分割することをお勧めします:

  • レシーバー(最小限の作業、解析なしなど)
    • 着信パケットを処理し、最後に読み取ったオブジェクトを非同期変数に入れます
  • 処理(あなたが書いたものから、これには長い時間がかかるように見えます)
    • 非同期空間からオブジェクトを読み取り、それを処理します (前のものを無視することを忘れないでください)

SO_RCVBUF のようなものをハックする必要がある場合は、C/C++ を使用して io 処理サブシステムに少し近づく必要があると思います

于 2012-07-14T20:31:51.567 に答える
0

あなたはまったく間違ったことをしました。受信バッファをできるだけ大きく設定してください。たとえば、512k。低く設定すると、パケットがドロップされる可能性が高くなるだけです。そして、受信コードを高速化するか、送信コードを低速化します。受信できないパケットを送信しても意味がありません。

于 2012-07-14T23:57:02.317 に答える