回答:
呼び出しclose
とshutdown
基本的なソケットに2つの異なる効果を持っています。
最初に指摘すべきことは、ソケットは基盤となるOSのリソースであり、 複数のプロセスが同じ基盤となるソケットのハンドルを持つことができることです。
これを呼び出すclose
と、ハンドルカウントが1つ減り、ハンドルカウントがゼロに達した場合、ソケットと関連する接続は通常のクローズ手順を通過し(FIN / EOFをピアに効果的に送信)、ソケットの割り当てが解除されます。
ここで注意すべきことは、別のプロセスがまだソケットへのハンドルを持っているためにハンドルカウントがゼロに達しない場合、接続は閉じられず、ソケットの割り当てが解除されないことです。
一方shutdown
、読み取りと書き込みを呼び出すと、基になる接続が閉じられ、ソケットへのハンドルを持つプロセスの数に関係なく、FIN / EOFがピアに送信されます。ただし、ソケットの割り当ては解除されないため、後でcloseを呼び出す必要があります。
.shutdown()
次の電話をかけるのは賢明でしょう.close()
か?それとも間に遅れがありますか?
シャットダウンとクローズの説明: グレースフルシャットダウン(msdn)
シャットダウン(あなたの場合)は、接続のもう一方の端に、ソケットからの読み取りまたはソケットへの書き込みを行う意図がないことを示します。次に、closeは、ソケットに関連付けられているすべてのメモリを解放します。
シャットダウンを省略すると、接続が正常に閉じられるまで、ソケットがOSスタックに残る可能性があります。
IMOの名前「シャットダウン」と「閉じる」は誤解を招くものであり、「閉じる」と「破棄」はそれらの違いを強調します。
それはソケットプログラミングHOWTO(py2 / py3)で直接言及されています
切断しています
厳密に言うと
shutdown
、ソケットの前に使用する必要がありますclose
。これshutdown
は、反対側のソケットに対する助言です。渡す引数によっては、「もう送信しないが、引き続き聞く」、または「聞いていない、良いリダンダンス!」」。ただし、ほとんどのソケットライブラリは、このエチケットの使用を怠るプログラマが通常使用するものであるため、close
と同じshutdown(); close()
です。したがって、ほとんどの場合、明示的なシャットダウンは必要ありません。...
close()
は十分です。Pythonのドキュメントを修正する必要があります。
上記のこのコードは間違っていませんか?
シャットダウン呼び出しの直後に閉じる呼び出しを行うと、カーネルがすべての発信バッファーをとにかく破棄する可能性があります。
http://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliableによると 、シャットダウンとシャットダウンの間で待機する必要があります読み取りが0を返すまで閉じます。
シャットダウンにはいくつかの種類があります。 http //msdn.microsoft.com/en-us/library/system.net.sockets.socket.shutdown.aspx。* nixも同様です。
Shutdown(1)、ソケットにこれ以上データを送信させない
これは
1-バッファーフラッシング
2-奇妙なエラー検出
3-安全な防護
さらに説明します。AからBにデータを送信する場合、Bへの送信は保証されていません。Aosバッファーへの送信のみが保証されており、A osバッファーはB osバッファーに送信します。
したがって、Aでshutdown(1)を呼び出すと、Aのバッファーがフラッシュされ、バッファーが空でない場合はエラーが発生します。つまり、データがまだピアに送信されていません
ただし、これは取り返しのつかないものなので、すべてのデータを完全に送信し、それがピアosバッファーで少なくとも確実であることを確認した後、それを行うことができます。
shutdown()
ができるのかわからなかったのです:)