キープアライブ オプションのない TCP 接続で、ワイヤを物理的に切断した場合、FIN/ACK の可能性がない場合、このソケットはすべてのアプリケーション データを喜んで受け入れ、送信バッファに入れ、永遠に送信しようとしますか?
そうでない場合、いつ、どのように停止するか = データの小さなチャンクを送信するアプリケーションにどのエラーが返されるか? Linuxとcについて話します。
ありがとうございました
ソケットが送信中の場合、(1) 最終的に送信バッファがいっぱいになるため、次の送信呼び出しがブロックされ、(2) 最終的に TCP は ACK を受信しないために送信試行がタイムアウトし、接続がリセットされ、次の送信呼び出しにエラー。
送信側では、データをクライアントに送信できないため、送信バッファーがいっぱいになります。発信パケット (受信ウィンドウと送信バッファー内の使用可能なスペースによって許可される限り) は、単純に送信バッファーに留まり、TCP はそれらを再送信することになります。
URL: http://linux.die.net/man/2/send
ソケットがブロックされている場合、send()
呼び出しは単にブロックされ、アプリケーションはこの呼び出しを待機することになります。ソケットが非ブロッキングの場合、send() 呼び出しは -1 を返し、errno を EAGAIN または EWOULDBLOCK に設定します。
SO_KEEPALIVE を設定することは、確かにそのようなソケットの主なオプションです。さらに、/proc/sys/net/ipv4/ に記載されている tcp_retries1 と tcp_retries2 の値をいじることもできます。tcp_retries2 の制限に達したために送信者が接続を切断すると、次のブロッキング呼び出しで値 -1 が返され、errno が ETIMEDOUT に設定されます。これらのオプションは、ボックスのすべてのソケットにグローバルに適用されることに注意してください。そのため、注意して使用する必要があります。