2

私はどこかで、すべてのTCP接続に独自の125kB出力および入力バッファーがあることを読みました。このバッファがいっぱいで、Linuxでデータを送信し続けるとどうなりますか?

http://www.kernel.org/doc/man-pages/online/pages/man2/send.2.htmlによると、パケットは通知なしに黙ってドロップされます。これを防ぐにはどうすればよいですか?後で続行できるように、データの少なくとも一部が正しく送信されたかどうかを確認する方法はありますか?

4

2 に答える 2

7

簡単な答えはこれです。TCPソケットでの「送信」呼び出しは、リモートエンドポイントがデータを受信して​​消費した結果としてTCPスライディングウィンドウ(または内部キューバッファ)が開くまでブロックされます。ディスクが保存できるよりも速くファイルにバイトを書き込もうとするのと大差ありません。

ソケットが非ブロッキングモードに構成されている場合、データを送信できるようになるまで、sendはEWOULDBLOCKまたはEAGAINを返します。標準のポーリング選択、およびepoll呼び出しは期待どおりに機能するため、いつ再送信するかがわかります。

于 2012-09-04T18:53:52.933 に答える
0

「パケットが落とされた」ことはわかりません。プログラムがwrite()に対して行う呼び出しは、ブロックするか、失敗を返す可能性が高いと思います。

于 2012-09-04T18:38:37.760 に答える