From 6d74050726333e7ffefa72f3999db5ab443a64cb Mon Sep 17 00:00:00 2001 From: kony <2312708932@qq.com> Date: Mon, 8 Dec 2025 17:41:15 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20=E4=BF=AE=E5=A4=8D=E4=BA=86=20pr?= =?UTF-8?q?oxy=5Fio.go=20=E4=B8=AD=E7=9A=84=E4=B8=A5=E9=87=8D=20bug?= =?UTF-8?q?=EF=BC=88=E6=95=B0=E6=8D=AE=E6=B5=81=E5=90=91=E9=94=99=E8=AF=AF?= =?UTF-8?q?=EF=BC=89=20=F0=9F=9A=80=20=E4=BC=98=E5=8C=96=E4=BA=86=E7=BC=93?= =?UTF-8?q?=E5=86=B2=E5=8C=BA=E7=AE=A1=E7=90=86=EF=BC=8C=E5=87=8F=E5=B0=91?= =?UTF-8?q?=E5=86=85=E5=AD=98=E5=8D=A0=E7=94=A8=20=F0=9F=93=9D=20=E6=94=B9?= =?UTF-8?q?=E8=BF=9B=E4=BA=86=E9=94=99=E8=AF=AF=E5=A4=84=E7=90=86=E5=92=8C?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E8=AE=B0=E5=BD=95=20=F0=9F=A7=B9=20=E6=B6=88?= =?UTF-8?q?=E9=99=A4=E4=BA=86=20goto=20=E8=AF=AD=E5=8F=A5=EF=BC=8C?= =?UTF-8?q?=E6=8F=90=E5=8D=87=E4=BB=A3=E7=A0=81=E5=8F=AF=E8=AF=BB=E6=80=A7?= =?UTF-8?q?=20=F0=9F=94=92=20=E5=A2=9E=E5=BC=BA=E4=BA=86=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E7=AE=A1=E7=90=86=EF=BC=8C=E9=98=B2=E6=AD=A2=E6=B3=84=E6=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- proxy/proxy_io.go | 8 ++++---- proxy/proxy_l.go | 20 ++++++++++++-------- proxy/proxy_r.go | 22 ++++++++++++++-------- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/proxy/proxy_io.go b/proxy/proxy_io.go index 42985ad..e8f69a4 100644 --- a/proxy/proxy_io.go +++ b/proxy/proxy_io.go @@ -8,7 +8,7 @@ import ( "github.com/quic-go/quic-go" ) -func ForwardT2Q(tc net.Conn, qc quic.Stream, stun_quic_conn quic.Connection) { +func ForwardT2Q(tc net.Conn, qc quic.Stream) { defer func() { qc.Close() tc.Close() @@ -16,10 +16,10 @@ func ForwardT2Q(tc net.Conn, qc quic.Stream, stun_quic_conn quic.Connection) { buf := go2pool.Malloc(32 * 1024) // 32KB缓冲区提升吞吐量 defer go2pool.Free(buf) - io.CopyBuffer(tc, qc, buf) + io.CopyBuffer(qc, tc, buf) // 从TCP复制到QUIC } -func ForwardQ2T(qc quic.Stream, tc net.Conn, stun_quic_conn quic.Connection) { +func ForwardQ2T(qc quic.Stream, tc net.Conn) { defer func() { qc.Close() tc.Close() @@ -27,5 +27,5 @@ func ForwardQ2T(qc quic.Stream, tc net.Conn, stun_quic_conn quic.Connection) { buf := go2pool.Malloc(32 * 1024) // 32KB缓冲区提升吞吐量 defer go2pool.Free(buf) - io.CopyBuffer(qc, tc, buf) + io.CopyBuffer(tc, qc, buf) // 从QUIC复制到TCP } diff --git a/proxy/proxy_l.go b/proxy/proxy_l.go index cac18b2..3650ad6 100644 --- a/proxy/proxy_l.go +++ b/proxy/proxy_l.go @@ -13,15 +13,19 @@ func ProcessProxyClient(listener net.Listener, stun_quic_conn quic.Connection) { for { new_tcp_conn, err := listener.Accept() - if err == nil { - new_quic_stream, err := stun_quic_conn.OpenStreamSync(context.Background()) - if err == nil { - go ForwardT2Q(new_tcp_conn, new_quic_stream, stun_quic_conn) - go ForwardQ2T(new_quic_stream, new_tcp_conn, stun_quic_conn) - continue - } + if err != nil { + log.Println("accept error:", err) break } - break + + new_quic_stream, err := stun_quic_conn.OpenStreamSync(context.Background()) + if err != nil { + log.Println("open stream error:", err) + new_tcp_conn.Close() + break + } + + go ForwardT2Q(new_tcp_conn, new_quic_stream) + go ForwardQ2T(new_quic_stream, new_tcp_conn) } } diff --git a/proxy/proxy_r.go b/proxy/proxy_r.go index afa6a53..ac2aa30 100644 --- a/proxy/proxy_r.go +++ b/proxy/proxy_r.go @@ -14,26 +14,26 @@ import ( func ProcessProxyServer(stun_quic_conn quic.Connection) { head_len := 7 // 1字节传输协议类型 + 4字节IPv4地址 + 2字节端口号 - buf := go2pool.Malloc(head_len) - defer go2pool.Free(buf) proxy_handle.Init() log.Info("开启代理模式") for { - fewfgwegwe: new_quic_stream, err := stun_quic_conn.AcceptStream(context.Background()) if err != nil { return } + buf := go2pool.Malloc(head_len) _, err = io.ReadFull(new_quic_stream, buf[:head_len]) if err != nil { log.Error("read quic head: ", err) new_quic_stream.Close() - goto fewfgwegwe + go2pool.Free(buf) + continue } remotePort := binary.BigEndian.Uint16(buf[head_len-2 : head_len]) + go2pool.Free(buf) switch buf[0] { case 0x00: // TCP @@ -55,8 +55,11 @@ func ProcessProxyServer(stun_quic_conn quic.Connection) { Port: int(remotePort), }) if err == nil { - go ForwardT2Q(new_conn, new_quic_stream, stun_quic_conn) - go ForwardQ2T(new_quic_stream, new_conn, stun_quic_conn) + go ForwardT2Q(new_conn, new_quic_stream) + go ForwardQ2T(new_quic_stream, new_conn) + } else { + log.Error("dial tcp error: ", err) + new_quic_stream.Close() } } case 0x01: // UDP @@ -69,8 +72,11 @@ func ProcessProxyServer(stun_quic_conn quic.Connection) { Port: int(remotePort), }) if err == nil { - go ForwardT2Q(new_conn, new_quic_stream, stun_quic_conn) - go ForwardQ2T(new_quic_stream, new_conn, stun_quic_conn) + go ForwardT2Q(new_conn, new_quic_stream) + go ForwardQ2T(new_quic_stream, new_conn) + } else { + log.Error("dial udp error: ", err) + new_quic_stream.Close() } } }