当我想删除客户端与我的服务器的连接时,我正在使用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之前尝试清空本地接收缓冲区。
这是正确的还是有办法保证正常关机?
答案 0 :(得分:2)
首先关闭传出通道socket.Shutdown(SocketShutdown.Send))
,然后继续读取套接字,即可完成正常关机。
另一方将读取您的关闭请求作为0字节消息,并在发送所有剩余数据后,它应通过关闭其套接字来响应。这会导致您的一方收到0字节的消息,从而结束交易。