首页 文章

如何知道Golang网络包中的TCP连接是否已关闭?

提问于
浏览
42

我是Golang的新手 .

我正在实现一个小型TCP服务器,如何知道我的一个客户是否已关闭?我应该尝试阅读或写入并检查错误是否为零?

3 回答

  • 50

    那个帖子“Best way to reliably detect that a TCP connection is closed”,使用 net.Conn 代表' c '(也见于utils/ping.golocale-backend/server.gomany other instances):

    one := []byte{}
    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() {
      ...
    
  • 13

    只是尝试从它读取,如果它关闭它将抛出一个错误 . 如果你愿意,可以优雅地处理!

    为了放弃过多的风险:

    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
    }
    

    以下是使用net包制作小型TCP“聊天服务器”的一个很好的介绍:

    Golang Away: TCP Chat Server

  • -1
    _, err := conn.Read(make([]byte, 0))
            if err!=io.EOF{
                // this connection is invalid
                logger.W("conn closed....",err)
    
            }else{
                byt, _:= ioutil.ReadAll(conn);
            }
    

相关问题