web-dev-qa-db-ja.com

ソケットのシャットダウン、切断、クローズ、破棄は正確には何をしているのですか?

ネットワークプログラミングの初心者を対象とした、これらの4つの方法実際にの簡単な説明を見つけるのは驚くほど困難です。人々は通常、特定のシナリオでソケットを閉じるための適切な方法であると自分が信じていることだけを述べていますが、各ステップの背後で何が起こっているのかは述べていません。

魚を教えるという哲学に従って、ShutdownDisconnectCloseおよびDisposeメソッドについて説明できますか?

21

StackOverflowで answer を使用すると、ようやく理解の一端が見えたように思いました。それから私は少しテストに行きました、そしてこれは初心者の見方の要約です。これは専門知識ではなく推論に基づいているため、間違っている場合は修正してください。

シャットダウン

Shutdownは、指定された引数に応じて、SendおよびReceiveメソッドを無効にします。基本的なプロトコル処理を無効にすることはなく、ブロックすることもありません。

Sendが無効になっている場合は、ゼロバイトの送信パケットを基礎となる送信バッファーにキューイングします。相手側がこのパケットを受信すると、ソケットがデータを送信しないことがわかります。

Receiveが無効になっている場合、相手側が送信しようとしている可能性のあるデータは失われます。

Receiveを無効にせずにSendを無効にすると、ソケットがデータを受信できなくなります。ゼロバイトのパケットは送信されないので、相手側は何かを送信しようとするまで、そしてソケットのプロトコルが確認を必要とする場合にのみそれについて何も知りません。

切断する

まず、DisconnectShutdown(SocketShutdown.Both)と同等の処理を行います。

次に、次の2つのことを待ってブロックします。

  1. キューに入れられたすべての送信データが送信されます。
  2. 反対側がゼロバイトのパケットを確認するため(基礎となるプロトコルに該当する場合)。

Disconnect(false)を呼び出すと、システムリソースが解放されます。

閉じる

Closeはシステムリソースを解放します。キューに入っているデータの送信が突然停止する場合があります。引数を指定して呼び出された場合は、データが送信されるまで待機しますが、指定されたタイムアウトまで待機します。

廃棄

Disposeは、timeout引数なしのCloseオーバーロードと同じです。より正確には、タイムアウトなしのCloseDisposeと同じです。

ソケットでusingブロックを使用すると、自動的にDisposeが呼び出されます。

29