反復サーバー・プログラムでのリンガー・オプション

デフォルト解釈により、ソケットに未送信データがあっても、クローズ・ソケット呼び出し は即時に制御をユーザーのプログラムに戻します。 このデータは、TCP プロトコル層によって転送されますが、ユーザーのプログラム にはいかなるエラーも通知されません。 ブロック・ソケットでも非ブロック・ソケットでも同じく、通知されません。

未送信データが送信され、ユーザーによって確認されてから、制御を ユーザーのプログラムに戻すよう要求することができます。 これを行うためには、setsockopt 呼び出しで SO_LINGER オプションを 指定します。 実際に close() 呼び出しを出す前に、以下のオプショナル・フィールドを 渡してください。

ONOFF
このフルワードは、SO_LINGER オプションを使用可能または 使用不能にするために使用されます。 非 0 値ならばオプションが使用可能になります。0 値の場合にはオプションは 使用不能になります。
LINGER
これは、リンガー時間 (秒数) です。これは、クローズ呼び出しが監視する 最大遅延です。 この時間が満了する前にデータが正常に送信された場合には、ユーザーの プログラムに制御が戻されます。 データが正常に送信される前にこの時間間隔が満了した場合にも、ユーザーの プログラムに制御が戻されます。 2 つの戻りイベントを区別することはできません。
注: リンガー時間を 0 に設定すると、接続は通常の方法ではクローズできませんが、停止して、結果的には RESET セグメントが接続パートナーに送信されます。 また、異常終了するソケットが非ブロッキング・モードになっている場合、 クローズ呼び出しは、リンガー・オプションが設定されていなかった場合と同じように扱われます。