【问题标题】:Golang 1.5 io.Copy blocked with two TCPConnGolang 1.5 io.Copy 被两个 TCPConn 阻塞
【发布时间】:2015-09-08 14:38:04
【问题描述】:

http://play.golang.org/p/gZo5RqgY4F

我对@9​​87654322@ 方法有疑问。上面的链接将在 Go 1.5 下的第 44 行阻塞。但将在 1.4.2 中通过。我不知道这个问题。

这是我的 Go 版本:go version go 1.5 darwin/amd64

io.Copy 何时在 go 1.5 中返回?

【问题讨论】:

    标签: tcp go connection


    【解决方案1】:

    以前,当系统调用的时间会在您的第二个 io.Copy [第 41 行] 中导致写入错误时,您会很幸运。 (忽略错误往往会隐藏错误)

    这纯粹是偶然的(甚至可能是不正确的)。由于该副本 (conn2) 的源连接永远不会关闭,io.Copy 永远不会收到 io.EOF 并且不会返回。您需要关闭每个复制 goroutine 中的相反连接以解除阻止对方对 io.Copy 的调用。

    wg.Add(1)
    go func() {
        io.Copy(conn1, conn2)
        // conn2 has returned EOF or an error, so we need to shut down the
        // other half of the duplex copy.
        conn1.Close()
        wg.Done()
    }()
    
    wg.Add(1)
    go func() {
        io.Copy(conn2, conn1)
        conn2.Close()
        wg.Done()
    }()
    

    【讨论】:

      猜你喜欢
      • 2020-10-12
      • 2016-07-06
      • 2017-11-26
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 2015-04-22
      • 1970-01-01
      相关资源
      最近更新 更多