net.Conn 是否存在可恢复的读取错误?

如果.Read()a 的方法net.Conn返回错误,这是否意味着将来的读取也会因错误而失败?或者有可恢复的错误吗?如果是这样,我如何知道是否/何时重试读取?



SMILET
浏览 124回答 2
2回答

守着星空守着你

conn.Read一般来说,可重试的操作不会出现任何错误。该界面的大多数使用io.Reader都会假设所有错误都是最终的。任何net确保可重试的包错误都将符合接口net.Error,并公开一个Temporary方法。这最常在Accept循环中使用,就像 http 包中的这个解释示例一样for {    rw, e := l.Accept()    if e != nil {        if ne, ok := e.(net.Error); ok && ne.Temporary() {            if tempDelay == 0 {                tempDelay = 5 * time.Millisecond            } else {                tempDelay *= 2            }            if max := 1 * time.Second; tempDelay > max {                tempDelay = max            }            time.Sleep(tempDelay)            continue        }        return e    }}任何其他可能的情况都需要在了解协议和当前情况的情况下根据个人情况进行处理。

莫回无

超时是从net.TCPConn读取时唯一可恢复的错误,并且只有在连接上设置读取截止时间时才会返回该错误。使用 Error.Temporary()检查重试时可能解决的错误,并使用Error.Timeout()检查超时: n, err := c.Read(buf) // process buf[:n] bytes if e.(net.Error); ok && e.Timeout() && e.Temporary() {    // handle recoverable read deadline expiration } else if err != nil {    // handle other errors }

慕容森

查看net包的具体错误类型https://golang.org/pkg/net/#OpError它提供了一种特定的Temporary()方法来确定是否是非终止错误。要手动找出哪个错误,Temporary您必须检查网络、操作系统和其他一些内部包中定义的每个错误。要以编程方式检查临时错误,您可以声明自己的 local ,或者可以依赖 net 包https://golang.org/pkg/net/#Errortemporary interface{ Temporary() bool }提供的此接口该OpError.Temporary方法测试其内部错误是否实现了net.temporary接口(https://golang.org/src/net/net.go?s=16056:16090#L501Temporary() ),如果是则返回内部错误的调用结果,例如https://golang.org/src/net/net.go?s=19122:19157#L605。我不确定您正在考虑哪种读取重试,但是,内部 fd.read 方法再次实现重试 https://golang.org/src/internal/poll/fd_unix.go#L165
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go