ntdll
V2EX  ›  Go 编程语言

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

By ntdll at 2022 年 5 月 25 日 · 1494 次点击

练手项目,开发一个 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 方法始终没有返回。

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

2 条回复  •  2022-06-23 17:25:34 +08:00
cctv1005s927
   1
cctv1005s927  
   2022 年 6 月 9 日
🐎
aladdinding
   2
aladdinding  
   2022 年 6 月 23 日
因为有一端没有 close
The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
© 2026 V2EX · 44ms · 3.9.8.5