首页 > 解决方案 > net.Conn 是否存在可恢复的读取错误?

问题描述

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

标签: gonetworking

解决方案


通常,您不会因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
    }
}

任何其他可能的情况都需要在了解协议和手头情况的情况下单独处理。


推荐阅读