状況:サーバーがaccept()を呼び出します。クライアントはSYNをサーバーに送信します。サーバーはSYNを取得し、SYN/ACKをクライアントに送り返します。ただし、クライアントはハングアップ/停止するため、サーバーにACKを送り返すことはありません。
何が起こるのですか?accept()はSYNを受信するとすぐに戻りますか、それともクライアントのACKが返されるまでブロックしますか?ブロックした場合、最終的にタイムアウトになりますか?
状況:サーバーがaccept()を呼び出します。クライアントはSYNをサーバーに送信します。サーバーはSYNを取得し、SYN/ACKをクライアントに送り返します。ただし、クライアントはハングアップ/停止するため、サーバーにACKを送り返すことはありません。
何が起こるのですか?accept()はSYNを受信するとすぐに戻りますか、それともクライアントのACKが返されるまでブロックしますか?ブロックした場合、最終的にタイムアウトになりますか?
クライアントが ACK を送信しない場合、accept() はブロックするか、ソケットが非ブロックとしてマークされている場合は EAGAIN を返します。
そのシナリオは実際には DoS (サービス拒否) に直面しており、受け入れのためのリソースがオペレーティング システムによって使用されるために返されるため、最終的にはタイムアウトになります。受け入れが有効なファイルディスクリプタで返されると、クライアントはサーバーに接続されるため、マスターソケットがブロックされる可能性があります
クライアントからの接続中にエラーが発生した場合、値 errno が設定され、ログに記録するか、エラー メッセージを表示することをお勧めします。ですが、man ページを読んでください。ほとんどの場合、これが最良の情報源です。
ハンドシェイクが完了しないためにタイムアウトなどの障害が発生した場合、-1が返され、errnoが設定されます。マニュアルページを見た後、errnoがECONNABORTEDに設定されると思います。