conn切换数据时,如果没有数据传输,会发生什么情况?
When conn switch data, if there is no data for transmitting, what will happen?
当我阅读 opensource code:
下面有这段代码:
streamConn := func(dst io.Writer, src io.Reader) {
io.Copy(dst, src)
streamWait.Done()
}
go streamConn(remoteConn, conn)
go streamConn(conn, remoteConn)
你看那里用两个 go streamConn()
在两个 conn
之间切换数据。
还有我想知道如果remoteConn
没有数据要传,那里copy什么?复制 nil
?
通常网络套接字以阻塞模式运行——如果没有更多数据要接收,那么“接收”操作将坐在那里等待 直到有一些。这就是为什么有两个 goroutine,每个方向一个——这样一个可以继续复制数据,而另一个仍在等待数据(读取时阻塞)。
对于类似但更直接的示例,您会发现在同一文件中更高一点的地方直接调用了 remoteConn.Read(data)
。调用时,Read() 不会 return 直到它获得 some 数据 – 或者直到它达到使用 SetReadDeadline() 设置的超时(在这种情况下它将 return 通过 err
).
超时错误
当我阅读 opensource code:
下面有这段代码:
streamConn := func(dst io.Writer, src io.Reader) {
io.Copy(dst, src)
streamWait.Done()
}
go streamConn(remoteConn, conn)
go streamConn(conn, remoteConn)
你看那里用两个 go streamConn()
在两个 conn
之间切换数据。
还有我想知道如果remoteConn
没有数据要传,那里copy什么?复制 nil
?
通常网络套接字以阻塞模式运行——如果没有更多数据要接收,那么“接收”操作将坐在那里等待 直到有一些。这就是为什么有两个 goroutine,每个方向一个——这样一个可以继续复制数据,而另一个仍在等待数据(读取时阻塞)。
对于类似但更直接的示例,您会发现在同一文件中更高一点的地方直接调用了 remoteConn.Read(data)
。调用时,Read() 不会 return 直到它获得 some 数据 – 或者直到它达到使用 SetReadDeadline() 设置的超时(在这种情况下它将 return 通过 err
).