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

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

Patricia Arquette
发布: 2024-12-19 04:58:16
原创
355 人浏览过

How to Reliably Detect TCP Connection Closure in Go's `net` Package?

在 Net Package 中检测 TCP 连接关闭

在 TCP 服务器中,确定客户端何时关闭连接至关重要。本文探讨了如何在 net 包中有效地检测到这一点。

问题中建议的方法,依赖于带有错误检查的读或写操作,不推荐。相反,更可靠的方法是设置读取截止时间并检查特定的错误条件。

推荐方法:

以下代码片段,摘自“最佳方法”可靠地检测 TCP 连接已关闭”线程,演示了推荐的方法:

one := make([]byte, 1)
c.SetReadDeadline(time.Now())
if _, err := c.Read(one); err == io.EOF {
  l.Printf(logger.LevelDebug, "%s detected closed LAN connection", id)
  c.Close()
  c = nil
} else {
  var zero time.Time
  c.SetReadDeadline(time.Now().Add(10 * time.Millisecond))
}
登录后复制

说明:

  • SetReadDeadline 设置一个时间,超过该时间读取操作将失败并出现超时错误。
  • 如果读取未返回 EOF,则设置新的截止日期以检查后续操作中是否超时。

超时检测:

对于超时检测,可以使用以下代码使用:

if neterr, ok := err.(net.Error); ok & neterr.Timeout() {
  ...
}
登录后复制

这会检查错误是否是 net.Error,其中包含 Timeout() 等附加信息。

更新:

在 Go 1.7 及更高版本中,零字节读取立即返回,不会出现错误。因此,建议至少读取1个字节。

以上是如何在 Go 的 net 包中可靠地检测 TCP 连接关闭?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板