C#中Socket關閉 Close、Dispose、Shutdown、Disconnect
An answer on StackOverflow made me think I have finally reached some glimpse of an understanding. Then I went testing for a bit and here's the summary of a newbie's view. Please correct me if I'm wrong because this is based on inference, not expertise.
Shutdown
Shutdown
disables
the Send
and/or Receive
If Send
is
disabled, it also queues up a zero-byte send packet into the underlying send buffer. When the other side receives this packet, it knows that your socket will no longer send any data.
If Receive
is
disabled, any data the other side might be trying to send will be lost.
If Receive
is
disabled without disabling Send
,
it just prevents the socket from receiving data. Since no zero-byte packet will be sent, the other side won't know anything about it until it tries to send something, and only if the socket's protocol requires acknowledging.
Disconnect
First, Disconnect
does
the equivalent of Shutdown(SocketShutdown.Both)
.
Then it blocks, waiting for two things:
- For all the queued-up send data to be sent.
- For the other side to acknowledge the zero-byte packet (if applicable to the underlying protocol).
If you call Disconnect(false)
,
system resources will be freed.
Close
Close
frees
system resources. May abruptly stop sending queued-up data. If called with the argument, will wait for the data to be sent, but only up to the specified timeout.
Dispose
Dispose
is
same as the Close
overload
without the timeout argument. To be more precise, Close
without
timeout is the same as Dispose
.
If you use the using
block
on the socket, it will automatically call Dispose
.