为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
SMILET 2023-07-26 10:18:10
如果.Read()a 的方法net.Conn返回错误,这是否意味着将来的读取也会因错误而失败?或者有可恢复的错误吗?如果是这样,我如何知道是否/何时重试读取?
查看完整描述

2 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

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

    }

}

任何其他可能的情况都需要在了解协议和当前情况的情况下根据个人情况进行处理。


查看完整回答
反对 回复 2023-07-26
?
莫回无

TA贡献1865条经验 获得超7个赞

超时是从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

 }


查看完整回答
反对 回复 2023-07-26
?
慕容森

TA贡献1853条经验 获得超18个赞

查看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


查看完整回答
反对 回复 2023-07-26
  • 2 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号