练手项目,开发一个 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 方法始终没有返回。
请教大佬,这可能是什么原因,以及如何解决呢。
1
cctv1005s927 2022-06-09 10:47:53 +08:00
🐎
|
2
aladdinding 2022-06-23 17:25:34 +08:00
因为有一端没有 close
|