TcpClient重置与正常关机

时间:2015-08-12 21:24:29

标签: c# sockets tcp tcpclient shutdown

当我想删除客户端与我的服务器的连接时,我正在使用TcpClient并调用Close。我的理解是,如果尚未调用套接字,则Close将调用套接字。

任何人都可以解释"终止"意味着在下面的上下文中?根据我的观察,这意味着调用Shutdown的一方将发送硬重置(RST)而不是通过正常的关闭序列(FIN,ACK ...)。

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

  

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

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

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

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

1 个答案:

答案 0 :(得分:2)

首先关闭传出通道socket.Shutdown(SocketShutdown.Send)),然后继续读取套接字,即可完成正常关机。

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