ネットワークプログラミングの初心者を対象とした、これらの4つの方法実際にの簡単な説明を見つけるのは驚くほど困難です。人々は通常、特定のシナリオでソケットを閉じるための適切な方法であると自分が信じていることだけを述べていますが、各ステップの背後で何が起こっているのかは述べていません。
魚を教えるという哲学に従って、Shutdown
、Disconnect
、Close
およびDispose
メソッドについて説明できますか?
StackOverflowで answer を使用すると、ようやく理解の一端が見えたように思いました。それから私は少しテストに行きました、そしてこれは初心者の見方の要約です。これは専門知識ではなく推論に基づいているため、間違っている場合は修正してください。
Shutdown
は、指定された引数に応じて、Send
およびReceive
メソッドを無効にします。基本的なプロトコル処理を無効にすることはなく、ブロックすることもありません。
Send
が無効になっている場合は、ゼロバイトの送信パケットを基礎となる送信バッファーにキューイングします。相手側がこのパケットを受信すると、ソケットがデータを送信しないことがわかります。
Receive
が無効になっている場合、相手側が送信しようとしている可能性のあるデータは失われます。
Receive
を無効にせずにSend
を無効にすると、ソケットがデータを受信できなくなります。ゼロバイトのパケットは送信されないので、相手側は何かを送信しようとするまで、そしてソケットのプロトコルが確認を必要とする場合にのみそれについて何も知りません。
まず、Disconnect
はShutdown(SocketShutdown.Both)
と同等の処理を行います。
次に、次の2つのことを待ってブロックします。
Disconnect(false)
を呼び出すと、システムリソースが解放されます。
Close
はシステムリソースを解放します。キューに入っているデータの送信が突然停止する場合があります。引数を指定して呼び出された場合は、データが送信されるまで待機しますが、指定されたタイムアウトまで待機します。
Dispose
は、timeout引数なしのClose
オーバーロードと同じです。より正確には、タイムアウトなしのClose
はDispose
と同じです。
ソケットでusing
ブロックを使用すると、自動的にDispose
が呼び出されます。