很难找到关于这四种方法实际做什么的简单解释,针对网络编程新手。人们通常只是陈述他们认为在特定场景中关闭套接字的正确方法,而不是在每个步骤背后发生的事情。
按照教导人对鱼的理念,你能解释Shutdown
,Disconnect
,Close
和Dispose
方法吗?
答案 0 :(得分:21)
StackOverflow上的一个answer让我觉得我终于看到了一些谅解。然后我进行了一些测试,这是新手观点的总结。如果我错了,请纠正我,因为这是基于推理,而不是专业知识。
Shutdown
会禁用Send
和/或Receive
方法,具体取决于提供的参数。它不会禁用底层协议处理,它永远不会阻塞。
如果禁用Send
,它还会将零字节发送数据包排入底层发送缓冲区。当另一方收到此数据包时,它知道您的套接字将不再发送任何数据。
如果Receive
被禁用,则对方可能尝试发送的任何数据都将丢失。
如果在未禁用Receive
的情况下禁用Send
,则只会阻止套接字接收数据。由于不会发送零字节数据包,因此另一方在尝试发送内容之前不会对此有所了解,并且只有在套接字协议需要确认时才会知道。
首先,Disconnect
相当于Shutdown(SocketShutdown.Both)
。
然后阻止,等待两件事:
如果您致电Disconnect(false)
,系统资源将被释放。
Close
释放系统资源。可能会突然停止发送排队的数据。如果使用参数调用,将等待发送数据,但仅限于指定的超时。
Dispose
与没有超时参数的Close
重载相同。更准确地说,Close
没有超时与Dispose
相同。
如果你在套接字上使用using
块,它会自动调用Dispose
。