最近、次のようなコードを見ました (もちろん、 sock はソケット オブジェクトです)。
sock.shutdown(socket.SHUT_RDWR)
sock.close()
ソケットでシャットダウンを呼び出して閉じる目的は正確には何ですか? 違いがあるとすれば、このソケットは非ブロッキング IO に使用されているということです。
ベストアンサー1
および を呼び出すclose
と、shutdown
基礎となるソケットに 2 つの異なる効果が生じます。
まず指摘しておきたいのは、ソケットは基盤となるOSのリソースであり、複数のプロセスが同じ基になるソケットのハンドルを持つことができます。
これを呼び出すと、close
ハンドル カウントが 1 つ減り、ハンドル カウントが 0 に達した場合は、ソケットと関連する接続は通常のクローズ プロシージャを実行し (実質的にはピアに FIN/EOF を送信)、ソケットの割り当てが解除されます。
ここで注意すべきことは、別のプロセスがまだソケットへのハンドルを持っているためにハンドル数がゼロに達しない場合、接続が閉じられておらず、ソケットは解放されていません。
一方、shutdown
読み取りと書き込みの呼び出しは、ソケットへのハンドルを持つプロセスの数に関係なく、基礎となる接続を閉じ、ピアにFIN / EOFを送信します。ただし、ではないソケットの割り当てを解除し、その後に close を呼び出す必要があります。