套接字的关闭,断开,关闭和处理究竟做了什么?

时间:2016-02-05 16:37:48

标签: c# .net sockets network-programming winsock

很难找到关于这四种方法实际做什么的简单解释,针对网络编程新手。人们通常只是陈述他们认为在特定场景中关闭套接字的正确方法,而不是在每个步骤背后发生的事情。

按照教导人对鱼的理念,你能解释ShutdownDisconnectCloseDispose方法吗?

1 个答案:

答案 0 :(得分:21)

StackOverflow上的一个answer让我觉得我终于看到了一些谅解。然后我进行了一些测试,这是新手观点的总结。如果我错了,请纠正我,因为这是基于推理,而不是专业知识。

关闭

Shutdown会禁用Send和/或Receive方法,具体取决于提供的参数。它不会禁用底层协议处理,它永远不会阻塞。

如果禁用Send,它还会将零字节发送数据包排入底层发送缓冲区。当另一方收到此数据包时,它知道您的套接字将不再发送任何数据。

如果Receive被禁用,则对方可能尝试发送的任何数据都将丢失。

如果在未禁用Receive的情况下禁用Send,则只会阻止套接字接收数据。由于不会发送零字节数据包,因此另一方在尝试发送内容之前不会对此有所了解,并且只有在套接字协议需要确认时才会知道。

断开

首先,Disconnect相当于Shutdown(SocketShutdown.Both)

然后阻止,等待两件事:

  1. 对于要发送的所有排队发送数据。
  2. 让另一方确认零字节数据包(如果适用于基础协议)。
  3. 如果您致电Disconnect(false),系统资源将被释放。

    关闭

    Close释放系统资源。可能会突然停止发送排队的数据。如果使用参数调用,将等待发送数据,但仅限于指定的超时。

    处置

    Dispose与没有超时参数的Close重载相同。更准确地说,Close没有超时与Dispose相同。

    如果你在套接字上使用using块,它会自动调用Dispose