练手项目,开发一个 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 方法始终没有返回。
请教大佬,这可能是什么原因,以及如何解决呢。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.