在 Net 包中监视 TCP 连接状态
TCP 服务器实现中的一个常见任务是确定客户端连接何时关闭。本题探讨了一种在 Go net 包中检测连接关闭的可靠方法。
检查关闭的连接
建议的方法是尝试读取和写入操作并检查是否返回 nil 错误。如果两个操作都成功,则假定连接已打开。但是,此方法有局限性。
使用超时进行可靠检测
更可靠的解决方案包括设置读取截止时间并尝试单字节读取。如果读取完成时出现 io.EOF 错误,则连接被视为已关闭。为了防止由于客户端速度慢而导致误报,可以设置非零读取截止时间。
one := make([]byte, 1) c.SetReadDeadline(time.Now()) if _, err := c.Read(one); err == io.EOF { // Connection closed }
超时检测
如果读取超时到期,则提供error 会实现 net.Error 接口,并且可以使用 error 的 Timeout() 方法来验证
if neterr, ok := err.(net.Error); ok && neterr.Timeout() { // Connection timed out }
Go 1.7 注意事项
在 Go 1.7 中,零字节读取立即返回,不会出现错误。因此,确保至少读取一个字节对于避免误报至关重要。
以上是如何可靠地检测 Go 的 net 包中关闭的 TCP 连接?的详细内容。更多信息请关注PHP中文网其他相关文章!