V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
gam2046
V2EX  ›  Go 编程语言

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

  •  
  •   gam2046 · 2022-05-25 18:54:29 +08:00 · 794 次点击
    这是一个创建于 932 天前的主题,其中的信息可能已经有所发展或是发生改变。

    练手项目,开发一个 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-06-09 10:47:53 +08:00
    🐎
    aladdinding
        2
    aladdinding  
       2022-06-23 17:25:34 +08:00
    因为有一端没有 close
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2300 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:46 · PVG 23:46 · LAX 07:46 · JFK 10:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.