在 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)) }
说明:
超时检测:
对于超时检测,可以使用以下代码使用:
if neterr, ok := err.(net.Error); ok & neterr.Timeout() { ... }
这会检查错误是否是 net.Error,其中包含 Timeout() 等附加信息。
更新:
在 Go 1.7 及更高版本中,零字节读取立即返回,不会出现错误。因此,建议至少读取1个字节。
以上是如何在 Go 的 net 包中可靠地检测 TCP 连接关闭?的详细内容。更多信息请关注PHP中文网其他相关文章!