gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:05:39 25 4
gpt4 key购买 nike

我有一个服务器可以像这样处理接收数据:

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 ?

最佳答案

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

如果在本地调用了 Close(),您会得到一个 *net.OpError 消息 use of closed network connection .您可能只想检查 net.Error 接口(interface),因为这在理论上会涵盖更多错误情况。

        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 .只需读入您的缓冲区并自行检查读取的字节数和错误。

关于networking - 如何判断连接被服务器或客户端关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27419110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com