1

シンプルな直径のクライアントとサーバーを作成します (ソースへのリンク)。クライアントは 10000 個の ccr メッセージを送信する必要がありますが、wireshark では最大 300 個の ccr メッセージしか送信されません。他のメッセージにより、クライアントでタイムアウトが発生しました。Windows 7 を搭載した別のコンピューターでサーバーとクライアントを実行しています。JDiameter ソース行で、jdiameter が ccr を送信した行 (行 280)を見つけました。このコードを 280 行目の前に追加します

while(bytes.hasRemaining())

クライアントは ~ 9900 ccr を送信しますが、非常に遅いです。c++ で記述された他の直径サーバーでクライアントをテストしました。

この問題を解決する方法がわかりません。助けてくれてありがとう。

4

1 に答える 1

1

送信者の送信がゼロを返す場合、送信者のソケット送信バッファーがいっぱいであることを意味します。これは、受信者のソケット受信バッファーがいっぱいであることを意味します。これは、送信者が送信するよりも受信者の読み取りが遅いことを意味します。

だから、受信機を高速化します。

注: ノンブロッキング モードでは、write()呼び出しがゼロを返している間、呼び出しを単にループするだけでは十分ではありません。write()ゼロを返す場合は、次のことを行う必要があります。

  1. のチャネルを登録解除してOP_READに登録するOP_WRITE
  2. 選択ループに戻ります。
  3. OP_WRITE発火したら、再度書き込みます。今回は、ゼロが返されないOP_WRITE場合は、登録解除し、(おそらく、要件に応じて) register しますOP_READ

チャネルを常に登録しておくのOP_WRITEも正しくないことに注意してください。ソケット チャネルはほとんど常に書き込み可能です。つまり、ソケット送信バッファーにはほとんど常にスペースがあります。あなたが興味を持っているのは、書き込み不可と書き込み可能の間の遷移です。

于 2014-03-18T12:33:08.030 に答える