【问题标题】:How to check a net.Conn is closed?如何检查 net.Conn 是否已关闭?
【发布时间】:2017-07-08 00:37:39
【问题描述】:

或者如何检查它是否可用于循环中的Read 或Write?如果 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)
        }
    }
}

【问题讨论】:

    标签: go tcp


    【解决方案1】:

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

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

    一般情况下,您只需关注io.Reader api。

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

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

    【讨论】:

    • 请注意,这仅涵盖读取。写入不应返回io.EOF。
    猜你喜欢
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多