TcpClient 重置与正常关机

TcpClient Reset vs. Graceful Shutdown

我正在使用 TcpClient 并在我想断开客户端与我的服务器的连接时调用 Close。我的理解是如果尚未调用 Close 将在套接字上调用 Shutdown。

谁能解释一下“已终止”在下文中的含义?据我观察,这意味着调用 Shutdown 的一方将发送硬重置 (RST),而不是通过正常的关闭序列(FIN、ACK...)。

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

Setting how to Receive specifies that subsequent calls to Receive are not allowed. This has no effect on lower protocol layers. If you are using a connection-oriented protocol, the connection is terminated if either of the following conditions exist after a call to Shutdown :

  • Data is in the incoming network buffer waiting to be received.
  • More data has arrived.

基于此,如果我想正常关机,我必须在调用 Close 之前尝试清空本地接收缓冲区。

这是正确的还是有办法保证正常关机?

通过首先关闭您的传出通道 socket.Shutdown(SocketShutdown.Send)) 并继续在套接字上读取来完成正常关闭。

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