请教关于 io.Copy 方法挂起的原因

2022-05-25 18:54:29 +08:00
 gam2046

练手项目,开发一个 socks5 代理服务器。在实际传输数据时(此处略过关于 socks5 其他部分,假定已经进入数据传输阶段),简单的定义了方法:

func forward(src, dest net.Conn, cnt chan int64) {
	count, _ := io.Copy(src, dest)
	log.WithFields(log.Fields{
		"src":   src.LocalAddr().String(),
		"dest":  dest.LocalAddr().String(),
		"count": count,
	}).Debug("forward")
	cnt <- count
}

传输时直接调用

upstream := make(chan int64)
downstream := make(chan int64)
go forward(connection, target, downstream)
go forward(target, connection, upstream)
up := <-upstream
down := <-downstream
connection.Close()
target.Close()

但在实际运行时,发现会偶发性的挂起在io.Copy(src, dest)方法( forward 的日志只输出了一条,理应有两个),通过 curl 作为 socks5 客户端测试发现,实际上数据已经传输完成,curl 命令也已经传输完成并结束,但是 io.Copy 方法始终没有返回。

请教大佬,这可能是什么原因,以及如何解决呢。

794 次点击
所在节点    Go 编程语言
2 条回复
cctv1005s927
2022-06-09 10:47:53 +08:00
🐎
aladdinding
2022-06-23 17:25:34 +08:00
因为有一端没有 close

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/855276

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX