2

TCPソケットが非ブロッキングモードに設定されていて、ソケット送信バッファーが最初に設定されている場合、sendはすべてのデータを送信するためにループで使用されます。EAGAINエラーが原因で送信が失敗した場合、送信ソケットバッファーを増やすことはできますか?LinuxOSを使用しています。sendbufferサイズのサイズ変更が許可されているかどうかを知りたいと思いました。tcpのマニュアルページで、「個々の接続では、listen(2)またはconnect(2)呼び出しの前に、ソケットバッファサイズを設定して有効にする必要があります。」そのため、質問が発生しました

4

2 に答える 2

3

ネットワークバッファの調整を試すことはできますが、それはおそらく良い考えではありません。バッファのサイズに関係なく問題が発生する可能性があるため、その場合を処理するようにコーディングする必要があります。

于 2012-10-05T15:27:55.720 に答える
2

これは、カーネル内ネットワークスタック、つまり実行しているオペレーティングシステム(記述していません)の実装の詳細になります。これは、特定のソケット専用の数を制限するメモリであるため、ほとんどの最新のOSで実行できると思いますが、次の理由により、問題に取り組む方法はまったく間違っています。

  • 送信バッファサイズを無期限に増やすことはできません。OSはある時点でそれを制限します。
  • TCPはフロー制御を提供します-遅い受信機は速い送信者を遅くします-そしてそれはその信頼性に関連するTCPの利点です、それで受信機が十分に速くデータを消費しないならば、カーネルメモリにもっと多くのデータを押し込むことはどんな状況でも改善しません仕方。
  • あなたはただ怠惰であり、カーネルがあなたのためにすべてのバッファリングを行うことを望んでいます。

トラフィックバーストメモリ要件、事前設定されたソケット送信バッファサイズ、アプリケーション側のバッファを把握します。

于 2012-10-05T15:43:55.810 に答える