tcp - Golang 1.5 io.Copy 用两个 TCPConn 阻塞

标签 tcp go connection

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

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

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

io.Copy 在 go 1.5 中什么时候返回?

最佳答案

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

关于tcp - Golang 1.5 io.Copy 用两个 TCPConn 阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32460618/

相关文章:

networking - 跟踪路由 : Can it trace a path from A to B correctly?

c# - 通常只允许每个套接字地址(协议(protocol)/网络地址/端口)使用一次?

java - Connection 对象可以在构造函数之外与 JDBC RowSet 实例一起使用吗?

go - Go 编译可执行文件巨大的原因

Android SDK 管理器无法在 Windows 8 x64 上获取存储库

C#如何连接WPF和SQLITE数据库最简单的方法

r - 如何在 Windows 上托管 Shiny 的应用程序?创建TcpServer : address not available

java - 通过 TCP/IP 从 Droid 发送恒定速率数据流

使用 select 的 Golang channel 不会停止

android - 如何在 Crashlytics 中获取 golang 的 Stack-trace