2 回答
TA贡献1856条经验 获得超17个赞
该线程“的最佳方式可靠地检测TCP连接被关闭”,使用net.Conn了“ c”(也可见于utils/ping.go或locale-backend/server.go或许多其他情况下):
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() {
...
更新2019:tuxedo25在评论中提到:
在Go 1.7+中,零字节读取立即返回,并且永远不会返回错误。
您必须至少读取一个字节。
参见commit 5bcdd63并执行issue 15735
net:不要io.EOF从零字节读取中返回
TA贡献1799条经验 获得超8个赞
只要尝试从中读取,如果关闭它就会抛出错误。如果您愿意,请优雅地处理!
付出太多的风险:
func Read(c *net.Conn, buffer []byte) bool {
bytesRead, err := c.Read(buffer)
if err != nil {
c.Close()
log.Println(err)
return false
}
log.Println("Read ", bytesRead, " bytes")
return true
}
- 2 回答
- 0 关注
- 258 浏览
添加回答
举报