デバイスtxリングがいっぱいで、通常のC非ブロック書き込み(fd、buff)を実行して、データをTCP SNDバッファにキューに追加するとします。
これが失敗した場合はどうなりますか? UDPではパケットが破棄されますが、TCPではどうなりますか?
コンテキストは次のとおりです。
非ブロック方式で一連のTCPソケットにデータを順次送信するテスターがあります。 SND BUFFを埋めるのに十分なデータを送信します。
私がテストしている条件は、500の接続のうちのいくつかに対してSND BUFFを入力してから数秒間、非ブロックポーリングでOPS_WRITEイベントを受信しないことです。場合によっては、最大2〜3秒間アンケートで何も得られないことがあります。
TX RINGを512から2048に増やしましたが、ネットワークカードが10秒以上の容量に達していない場合、これは発生しません。
答え1
~から書き込み(2)、
間違い
⋮
イガオンまたはエドワードブロック
ファイル記述子FDソケットを参照し、非ブロックとしてマークされています(O_非遮断)、書き込みがブロックされます。 POSIX.1-2001はこの場合、エラーの1つが返されることを許可し、これらの定数が同じ値を持つ必要はないため、移植可能なアプリケーションは両方の可能性を確認する必要があります。
つまり、write
-1が返され、またはerrno
に設定されます。 (もちろんバッファ内のデータは転送されません。)EAGAIN
EWOULDBLOCK