【问题标题】:What exactly do socket's Shutdown, Disconnect, Close and Dispose do?socket 的 Shutdown、Disconnect、Close 和 Dispose 到底是做什么的?
【发布时间】:2016-05-15 17:23:57
【问题描述】:

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

按照“授人以渔”的理念,您能解释一下ShutdownDisconnectCloseDispose 方法吗?

【问题讨论】:

  • 我发现如果你在等待数据仍然出去,调用Shutdown是不够的。在调用 Disconnect 或 Close 之前,您可能需要手动休眠一小段时间(直到我找到更好的方法)。
  • 你看我的回答了吗?如果我在那儿(可能不在),Shutdown 将不会等待发送数据。此外,不带参数调用 Close(或 Dispose,这是同一件事)将突然停止发送数据。断开连接应该阻塞,直到发送完所有剩余数据。或者,超时关闭也将等到给定时间,然后突然停止传输。
  • 我确实阅读了您的答案,但在我的情况下不起作用。我想知道网卡驱动程序是否与行为有关。即使使用 linger set,有时数据也不会发送。我认为 Windows 堆栈有一些关闭错误,几乎没有 Microsoft 的过时文档。

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


【解决方案1】:

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

关机

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

如果Send 被禁用,它还会将一个零字节发送数据包排队到底层发送缓冲区中。当对方收到这个数据包时,就知道你的socket不会再发送任何数据了。

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

如果Receive 被禁用而不禁用Send,它只会阻止套接字接收数据。由于不会发送零字节数据包,因此对方在尝试发送某些内容之前不会知道它的任何信息,并且只有在套接字的协议需要确认时才知道。

断开连接

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

然后它阻塞,等待两件事:

  1. 对于所有排队的发送数据要发送。
  2. 让对方确认零字节数据包(如果适用于底层协议)。

如果你调用Disconnect(false),系统资源将被释放。

关闭

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

处置

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

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

【讨论】:

  • 如果您要解决规范问题,您可能还想在最后链接到一些其他现有帖子,并且绝对链接到 MSDN 文档。否则看起来不错。
  • 断开连接似乎是错误的。我怀疑它会等待所有数据被确认。文档说To ensure that all data is sent and received before the socket is closed, you should call Shutdown before calling the Disconnect method.。此外,我一直认为 Shutdown 等待确认,但我不再 100% 确定这一点。逗留选项似乎控制了这两种方法的作用,因此这个答案实际上可能适用于某些逗留选项。
  • @usr 好点。在那种情况下,Disconnect 实际上做了什么?相当于Close,具有重用资源的能力?
  • 我相信是这样,但我很惊讶现在在文档中读到它有时会阻塞并等待确认。
  • @usr 在 BeginDisconnect 页面上的例子是完全异步的,它在调用 BeginDisconnect 之前使用了 Shutdown。我得出的结论是,这意味着断开连接块。这是 IMO 关于套接字的最令人沮丧的事情:文档并不完全清楚正在发生的事情。 msdn.microsoft.com/en-us/library/…
猜你喜欢
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 2012-12-13
  • 2014-05-31
相关资源
最近更新 更多