首页 >后端开发 >Golang >如何可靠地检测 Go 的 net 包中关闭的 TCP 连接?

如何可靠地检测 Go 的 net 包中关闭的 TCP 连接?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-24 10:39:28838浏览

How Can I Reliably Detect Closed TCP Connections in Go's `net` Package?

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn