[[PageNavi(internal22-navi)]]
{{{ comment
h2w-title:コネクションのshutdown
}}}
== コネクションのshutdown == #SECTION07884000000000000000
先に述べたコネクションの切断方法は、先にクライアントがソケットをcloseし通信を停止したのち、サーバがソケットをcloseするという手順を提供する。
shutdownシステムコールは、クライアントがコネクションの切断の主導権を握るが、サーバ側に先にソケットをcloseするためのメカニズムである。
tcp_shutdown関数(shutdownシステムコール本体)は、ソケットをTCP_FIN_WAIT1状態に推移(tcp_close_state関数)させ、相手のソケットにFINを送る(tcp_send_fin関数)。少しすると相手からFIN対するACKが返され、TCP_FIN_WAIT2状態に推移(tcp_rcv_state_process関数)する。
tcp_shutdown関数でTCP_FIN_WAIT1、TCP_FIN_WAIT2に推移したソケットは継続して受信(tcp_rcv_state_process関数)可能である。相手のTCP_CLOSE_WAIT状態のソケットから送られて来たパケットを全て受信し、読み出すことができる。
相手のソケットがcloseされるとFINパケットが飛んで来て、それ以降のシーケンス番号のパケットを受け取れなくなる(tcp_rcv_state_process関数)。アプリケーションからは、その後もソケットのreceive_queueにパケットのある間はrecv処理を継続できるが、パケットが無くなった時点でEOFが返される。
あとは、アプリケーションの意志でソケットをcloseするだけある。
----
''(NIS)HirokazuTakahashi [[BR]]2000年06月11日 (日) 22時29分57秒 JST''1
[[PageNavi(internal22-navi)]]