为了账号安全,请及时绑定邮箱和手机立即绑定

如何知道net包中TCP连接是关闭的?

如何知道net包中TCP连接是关闭的?

Go
慕田峪9158850 2021-05-15 11:11:03
我正在实现一个小型TCP服务器。我怎么知道我的一位客户是否关门?我应该只是尝试读取或写入并检查是否err为nil?
查看完整描述

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从零字节读取中返回


查看完整回答
反对 回复 2021-05-17
?
守着星空守着你

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

}


查看完整回答
反对 回复 2021-05-17
  • 2 回答
  • 0 关注
  • 258 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信