如何检查 net.Conn 是否关闭?

acr*_*ing 6 tcp go

或者如何检查它是否可用于ReadWrite在循环中?如果 conn 已关闭或不可用,我们应该停止循环。

例如:

package main

import "net"

func main() {
    conn, err := net.Dial("tcp", "127.0.0.1:1111")
    defer conn.Close()
    for {
        buf := make([]byte, 1, 1)
        n, err := conn.Read(buf)
        if err != nil {
            // currently we can only stop the loop
            // when occur any errors
            log.Fatal(err)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*imB 2

您可能会收到许多错误,具体取决于连接关闭的方式。您可以指望从 a 收到的唯一错误Readio.EOF. io.EOF是用于指示连接已正常关闭的值。

其他错误可以根据net.Error其接口TimeoutTemporary方法进行检查。这些通常属于net.OpError. 从 a 返回的任何非临时错误Write都是致命的,因为它表明写入无法成功,但请注意,由于底层网络 API,不返回错误的写入仍然不能保证成功。

一般情况下按照api就可以了io.Reader

当 Read 在成功读取 n > 0 字节后遇到错误或文件结束条件时,它返回读取的字节数。它可能会从同一调用返回(非零)错误,或从后续调用返回错误(且 n == 0)。这种一般情况的一个实例是,在输入流末尾返回非零字节数的 Reader 可能返回 err == EOF 或 err == nil。下一次读取应返回 0、EOF。

如果有数据读取,您首先处理它。处理数据后,您可以在出现任何错误时中断循环。如果是io.EOF,则连接将正常关闭,并且您可以根据需要处理任何其他错误。

  • 请注意,这仅涵盖读取。写入不应返回“io.EOF”。 (2认同)