帮忙修复一个 golang 的连接问题,红包 50 元 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sk217
V2EX    外包

帮忙修复一个 golang 的连接问题,红包 50 元

  •  
  •   sk217 131 天前 2369 次点击
    这是一个创建于 131 天前的主题,其中的信息可能已经有所发展或是发生改变。
    问题是服务端连接断开后,或者服务端完全挂壁了之后,本地的透明代理的协程并没有关闭,且 TCP 状态还保持着,目标,服务端断开后,客户端自动断开与被代理端的 tcp 连接

    https://github.com/fqdeng/x-proxy

    感谢
    第 1 条附言    131 天前
    https://github.com/fqdeng/x-proxy#

    定位了,不是 io.copy 的问题,纯粹只有透明代理的情况下 无法关闭客户端的 IO ,我继续排查一下
    第 2 条附言    130 天前

    大家有AI一顿搞,根本没解决问题,果然AI不是万能的

    最后我试了一下socks5是没问题的,问题只可能出在获取src地址的调用上了 把这段代码 让qwen3-coder看了下

    • 定位到了

    https://github.com/fqdeng/x-proxy/blob/master/pkg/proxy/transparent_linux.go

    • 这个文件的的 110行
    fd := file.Fd() 

    这个会对文件描述符进行复制,复制后 Conn的行为会异常,导致Conn无法关闭,最终协程无法退出

    潜在影响:会严重影响 Conn 关闭! 问题所在: tcpConn.File() 会复制文件描述符 这个操作会将 TCP 连接的文件描述符复制给一个新的 *os.File 但原始的 net.Conn 仍然持有该连接 file.Close() 只关闭复制的文件描述符 当你调用 file.Close() 时,只是关闭了复制的 fd 原始的 net.Conn 仍然可以正常使用 但是!这会破坏连接的状态 在某些系统上,复制 fd 后再关闭它,可能会影响原始连接的行为 特别是在透明代理场景下,可能影响后续的数据传输

    第 3 条附言    130 天前
    AI 确实不是万能的,一堆代码弄过去分析 它一定给你弄错,还是要不断测试,把问题可能性缩小,最后把代码拿给 AI 分析才是理性的
    17 条回复    2025-08-15 22:18:23 +08:00
    suruiran
        1
    suruiran  
       131 天前
    读的时候加个 buf 。定时的读一个字节,然后放到 buf 里面,用来检测连接。然后业务读都从 buf 里取,还要加个锁或者 chan 来实现同步。
    676529483
        2
    676529483  
       131 天前
    加个心跳吧
    sk217
        3
    sk217  
    OP
       131 天前
    @suruiran 佬,能直接帮忙修复一下 io.go 文件 给我看看么,我对 golang 不是很懂的
    sk217
        4
    sk217  
    OP
       131 天前
    问题大概率出在这里,看有没有办法 加入心跳连接之类的功能
    https://github.com/fqdeng/x-proxy/blob/master/pkg/proxy/io.go
    sk217
        5
    sk217  
    OP
       131 天前
    @676529483 可以,我用 AI 试下,在应用层把协议改了,再加一层心跳检测
    mainjzb
        6
    mainjzb  
       131 天前
    io.go 文件 copyWithTimeout
    再写一个 copyTCPWithTimeout ,110 行 Read 失败后,调用 dst.CloseWrite() [dst 需要改成 net.TCPConn
    sk217
        7
    sk217  
    OP
       131 天前
    @mainjzb 佬,麻烦直接提个 PR 看看
    mrjnamei
        8
    mrjnamei  
       131 天前
    sk217
        9
    sk217  
    OP
       131 天前
    @mrjnamei 一眼看了,AI 投递的,哈哈,测试了还是不行,服务端即使关闭的情况下,客户端还是维持了跟被代理端的 TCP 连接
    zhouyin
        10
    zhouyin  
       131 天前
    以外包 fix bug 类项目 50 人民币怎么够 50 只够解决很小的 css html
    这种难度起码 400 美元
    ZGeek
        11
    ZGeek  
       131 天前
    看样子想做一个 windows 下的隧道,但是这样的东西其实已经很多了,为什么要自己开发呢?
    sk217
        12
    sk217  
    OP
       131 天前
    @ZGeek 看样子回复很多了,你为什么要发这个回复呢
    ChunkitAu
        13
    ChunkitAu  
       131 天前
    猜测: 卡在了`read`函数,设置了`SetReadDeadline`导致下一次循环还没开始,无法从`<-ctx.Done()` 退出

    感觉可以在起一个协程来来单独控制连接的关闭
    ```
    go func() {
    <-ctx.Done()
    src.Close()
    dst.Close()
    }()
    ```
    suruiran
        14
    suruiran  
       130 天前
    怎么仓库都没了,我上午都没进去看呢……
    sk217
        15
    sk217  
    OP
       130 天前
    @suruiran #14 私有化了
    sk217
        16
    sk217  
    OP
       130 天前
    @suruiran #14 又公开了,老哥看下,后续,问题出在 conn.Fd()上面了,这个方法会影响 Conn 的后续行为
    sk217
        17
    sk217  
    OP
       130 天前
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2957 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 12:21 PVG 20:21 LAX 04:21 JFK 07:21
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86