问题是服务端连接断开后,或者服务端完全挂壁了之后,本地的透明代理的协程并没有关闭,且 TCP 状态还保持着,目标,服务端断开后,客户端自动断开与被代理端的 tcp 连接
https://github.com/fqdeng/x-proxy
感谢
https://github.com/fqdeng/x-proxy
感谢
大家有AI一顿搞,根本没解决问题,果然AI不是万能的
最后我试了一下socks5是没问题的,问题只可能出在获取src地址的调用上了 把这段代码 让qwen3-coder看了下
https://github.com/fqdeng/x-proxy/blob/master/pkg/proxy/transparent_linux.go
fd := file.Fd()
这个会对文件描述符进行复制,复制后 Conn的行为会异常,导致Conn无法关闭,最终协程无法退出
潜在影响:会严重影响 Conn 关闭! 问题所在: tcpConn.File() 会复制文件描述符 这个操作会将 TCP 连接的文件描述符复制给一个新的 *os.File 但原始的 net.Conn 仍然持有该连接 file.Close() 只关闭复制的文件描述符 当你调用 file.Close() 时,只是关闭了复制的 fd 原始的 net.Conn 仍然可以正常使用 但是!这会破坏连接的状态 在某些系统上,复制 fd 后再关闭它,可能会影响原始连接的行为 特别是在透明代理场景下,可能影响后续的数据传输
1
suruiran Aug 15, 2025
读的时候加个 buf 。定时的读一个字节,然后放到 buf 里面,用来检测连接。然后业务读都从 buf 里取,还要加个锁或者 chan 来实现同步。
|
2
676529483 Aug 15, 2025
加个心跳吧
|
4
muam OP 问题大概率出在这里,看有没有办法 加入心跳连接之类的功能
https://github.com/fqdeng/x-proxy/blob/master/pkg/proxy/io.go |
6
mainjzb Aug 15, 2025
io.go 文件 copyWithTimeout
再写一个 copyTCPWithTimeout ,110 行 Read 失败后,调用 dst.CloseWrite() [dst 需要改成 net.TCPConn |
8
mrjnamei Aug 15, 2025
|
10
7uSK0CV63kJdhp0M Aug 15, 2025
以外包 fix bug 类项目 50 人民币怎么够 50 只够解决很小的 css html
这种难度起码 400 美元 |
11
ZGeek Aug 15, 2025
看样子想做一个 windows 下的隧道,但是这样的东西其实已经很多了,为什么要自己开发呢?
|
13
ChunkitAu Aug 15, 2025
猜测: 卡在了`read`函数,设置了`SetReadDeadline`导致下一次循环还没开始,无法从`<-ctx.Done()` 退出
感觉可以在起一个协程来来单独控制连接的关闭 ``` go func() { <-ctx.Done() src.Close() dst.Close() }() ``` |
14
suruiran Aug 15, 2025
怎么仓库都没了,我上午都没进去看呢……
|