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

Golang 1.5 io.Copy 被两个 TCPConn 阻塞

Golang 1.5 io.Copy 被两个 TCPConn 阻塞

Go
拉丁的传说 2021-11-08 10:54:16
http://play.golang.org/p/gZo5RqgY4F我有一个关于io.Copy方法的问题。上面的链接将在 Go 1.5 下的第 44 行中阻塞。但会在 1.4.2 中通过。我不知道这个问题。这是我的 go 版本:go version go 1.5 darwin/amd64.io.Copygo 1.5 什么时候返回的?
查看完整描述

1 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

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

}()


查看完整回答
反对 回复 2021-11-08
  • 1 回答
  • 0 关注
  • 433 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信