首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要帮助理解go-shadowsocks2中的中继功能

需要帮助理解go-shadowsocks2中的中继功能
EN

Stack Overflow用户
提问于 2020-08-20 22:41:24
回答 1查看 48关注 0票数 0
代码语言:javascript
复制
// relay copies between left and right bidirectionally. Returns number of
// bytes copied from right to left, from left to right, and any error occurred.
func relay(left, right net.Conn) (int64, int64, error) {
        type res struct {
                N   int64
                Err error
        }
        ch := make(chan res)

        go func() {
                n, err := io.Copy(right, left)
                right.SetDeadline(time.Now()) // wake up the other goroutine blocking on right
                left.SetDeadline(time.Now())  // wake up the other goroutine blocking on left
                ch <- res{n, err}
        }()

        n, err := io.Copy(left, right)
        right.SetDeadline(time.Now()) // wake up the other goroutine blocking on right
        left.SetDeadline(time.Now())  // wake up the other goroutine blocking on left
        rs := <-ch

        if err == nil {
                err = rs.Err
        }
        return n, rs.N, err
}

这是来自go-shadowsocks2项目,但是,我不能理解left.SetDeadline(time.Now())部分,注释(唤醒左边的另一个goroutine阻塞)是什么意思?

带有time.Now()参数的SetDeadline看起来很不寻常,有谁能帮我理解一下吗?

EN

回答 1

Stack Overflow用户

发布于 2020-08-20 22:51:01

这可能会有所帮助,请参阅net.Conn文档:

截止日期是I/O操作失败而不是阻塞的绝对时间。截止日期适用于所有将来和挂起的I/O,而不仅仅是紧随其后的读或写调用。超过截止日期后,可以通过在将来设置截止日期来刷新连接。

看起来好像有两个goroutine将数据从一个连接复制到另一个连接。当其中任何一个操作的源连接关闭时,该复制操作将终止,但另一个复制操作将被阻止。根据net.Conn文档,通过设置超时将导致阻塞的复制操作失败,从而解除阻塞的gouroutine例程。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63507517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档