TcpClient复位vs.优雅关机

本文关键字:关机 vs 复位 TcpClient | 更新日期: 2023-09-27 18:07:30

我使用TcpClient并在我想要放弃客户端与服务器的连接时调用Close。我的理解是Close将在套接字上调用Shutdown,如果它还没有被调用。

有谁能解释一下"终止"是什么吗?意思是什么?根据我的观察,这意味着调用Shutdown的一方将发送硬复位(RST),而不是经过优雅的关闭序列(FIN, ACK…)。

从https://msdn.microsoft.com/en-us/library/system.net.sockets.socket.shutdown (v = vs.110) . aspx

设置接收方式表示后续呼叫接收不允许的。这对较低的协议层没有影响。如果你是使用面向连接的协议,如果终止连接在调用Shutdown后存在以下任一条件:

  • 数据在传入网络缓冲区中等待接收。
  • 有更多数据到达。

基于此,如果我想做一个优雅的关闭,我必须在调用Close之前清空我的本地接收缓冲区。

这是正确的吗?或者是否有一种方法可以保证正常关闭发生?

TcpClient复位vs.优雅关机

通过首先关闭出站通道socket.Shutdown(SocketShutdown.Send)),并继续在套接字上读取来完成优雅的关闭。

另一端将读取你的关闭请求作为一个0字节的消息,在发送完所有剩余的数据后,它应该通过关闭它的套接字来响应。这将导致您的一方接收到一条0字节的消息,从而结束交易。