Golang 1.5 io.Copy被两个TCPConn阻止

时间:2015-09-08 14:38:04

标签: tcp go connection

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

我对io.Copy方法有疑问。上面的链接将在Go 1.5的第44行阻止。但是会通过1.4.2。我不知道这个问题。

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

io.Copy何时返回1.5?

1 个答案:

答案 0 :(得分:3)

以前,当系统调用的时间在第二个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()
}()