很难找到一份简单明了的解释,专门为网络编程新手讲解这四种方法,它们实际上是做什么的。人们通常只陈述在特定场景下关闭套接字的正确方式,但不说每个步骤背后发生了什么。
按照授人以鱼不如授人以渔的哲学,你能解释一下Shutdown
、Disconnect
、Close
和Dispose
这四种方法吗?
很难找到一份简单明了的解释,专门为网络编程新手讲解这四种方法,它们实际上是做什么的。人们通常只陈述在特定场景下关闭套接字的正确方式,但不说每个步骤背后发生了什么。
按照授人以鱼不如授人以渔的哲学,你能解释一下Shutdown
、Disconnect
、Close
和Dispose
这四种方法吗?
这个回答在StackOverflow上让我觉得我终于有了一些了解。然后我进行了一些测试,以下是一个新手的总结。如果我理解错了,请纠正我,因为这是基于推论而非专业知识。
Shutdown
方法禁用Send
和/或Receive
方法,具体取决于提供的参数。它不会禁用底层协议处理并且永远不会阻塞。
如果禁用了Send
,它会将一个零字节的发送包排队到底层发送缓冲区中。当对方接收到该包时,它就知道你的套接字将不再发送任何数据。
如果禁用了Receive
,则对方可能正在尝试发送的任何数据都将丢失。
如果禁用了Receive
但没有禁用Send
,它只会阻止套接字接收数据。由于不会发送零字节数据包,所以只有在对方尝试发送数据且套接字的协议要求确认时,对方才会知道它。
首先,Disconnect
执行相当于Shutdown(SocketShutdown.Both)
的操作。
然后,它会阻塞等待两件事情:
如果调用Disconnect(false)
,系统资源将被释放。
Close
方法释放系统资源。可能会突然停止发送排队的数据。如果带参数调用,则最多等待指定的超时时间来发送数据。
Dispose
相当于没有超时参数的 Close
重载。更准确地说,没有超时的 Close
和 Dispose
是相同的。
如果您在套接字上使用 using
块,它将自动调用 Dispose
。
Disconnect
实际上是做什么的?它相当于 Close
并具有重用资源的能力吗? - relatively_random