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() } } }