我正在读《黑帽围棋》这本书。我遇到了一个简单的 TCP 代理示例。它基本上只是转发请求并发回回复。代理代码的要点如下所示(已修改):
func handle(src net.Conn) {
dst, err := net.Dial("tcp", "example.com:80")
if err != nil {
log.Fatalln("Unable to connect to remote")
}
defer dst.Close()
// Run in goroutine to prevent io.Copy from blocking
go func() {
if _, err := io.Copy(dst, src); err != nil {
log.Fatalln("Something wrong src -> dst")
}
}()
if _, err := io.Copy(src, dst); err != nil {
log.Fatalln("Something wrong dst -> src")
}
}
我不明白的部分是注释“在 goroutine 中运行以防止 io.Copy 阻塞”。我已经在有和没有将它包装在 goroutine 中的情况下运行它,它只适用于 goroutine,但我不明白为什么。我们不能io.Copy为请求运行一个阻塞,然后为响应运行另一个阻塞吗?我想我很难理解如果第一个io.Copy在 goroutine 中运行,我们如何保证排序。
Helenr
杨魅力
相关分类