如何判断服务器或客户端关闭的连接?

时间:2014-12-11 09:16:01

标签: networking go

我有一个处理接收数据的服务器:

func handleRecv(conn *net.TCPConn) {
    header := make([]byte, 2)
    for {
        /**block until recieve len(header)**/
        n, err := io.ReadFull(conn, header)
        if err != nil {
             log.Error(err)
              break
        }
     }
 }

我想知道哪个连接被关闭了?服务器或客户端根据err

1 个答案:

答案 0 :(得分:2)

首先,如果您在本地关闭连接,则应该在代码中了解它。否则,接收io.EOF通常表示远程端发起了关闭。

如果在本地调用Close(),则会收到*net.OpError消息use of closed network connection。您可能只想检查net.Error接口,因为理论上这将涵盖更多错误条件。

        if err, ok := err.(net.Error); ok {
            fmt.Error("not an io.EOF")
            fmt.Error(err.Error())
        }

但是,如果在本地连接上调用CloseRead()(这不太可能,但它有其用途),则无效。这将返回io.EOF,这就是为什么你仍然需要知道本地连接发生了什么。

如果连接因超时而关闭,您将收到net.Error表示超时:

        if err, ok := err.(net.Error); ok && err.Timeout() {
            fmt.Error("timeout error")
        }

最后,如果您担心返回的错误,您可能不想使用io.Readfull,它在短暂阅读后不会返回io.EOF。只需读入缓冲区并自行检查读取的字节数和错误。