这不是特定于Go的,而是通过底层TCP套接字显示出来的工件。
TCP终止步骤的详细图示在此页面的底部:http
:
//www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm
简单的版本是,当客户端关闭其套接字时,它将发送FIN,并从服务器接收ACK。然后,它等待服务器执行相同的操作。但是,您不是发送FIN,而是发送更多的数据,这些数据将被丢弃,并且客户端套接字现在假定来自您的任何其他数据都是无效的,因此下次发送时会收到RST,这就是气泡进入您看到的错误。
回到您的程序,您需要以某种方式进行处理。一般来说,你能想到的任何人负责发起发送的,还负责启动终止,因此,您的服务器应该假设它可以继续发送,直到 它
关闭连接,或遇到错误。如果需要更可靠地检测到客户端关闭,则需要在协议中具有某种客户端响应。这样,可以在套接字上调用recv并返回0,这将提醒您关闭的连接。
进行中,这将从连接的Read方法(或您的情况下,在Copy中)返回EOF错误。SetWriteDeadline无法正常工作,因为会进行少量写入,然后将其静默删除,否则客户端最终将以RST响应,从而给您带来错误。



