我有一个处理接收数据的服务器:
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
?
答案 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
。只需读入缓冲区并自行检查读取的字节数和错误。