如何检查net.Conn已关闭?

时间:2017-07-07 15:48:51

标签: go tcp

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

1 个答案:

答案 0 :(得分:1)

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

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

一般情况下,您只需按照io.Reader API即可。

  

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

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

相关问题