From d0aca83181a3bb290cea2da4b163fceb5258084f Mon Sep 17 00:00:00 2001 From: ginuerzh Date: Fri, 27 Mar 2015 20:27:52 +0800 Subject: [PATCH] fix udp tunnel --- client.go | 21 ++++++++++++--------- server.go | 11 ++++++----- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/client.go b/client.go index a346b85..16cd319 100644 --- a/client.go +++ b/client.go @@ -6,6 +6,7 @@ import ( "github.com/ginuerzh/gosocks5" "github.com/shadowsocks/shadowsocks-go/shadowsocks" "io" + "io/ioutil" "log" "net" "net/http" @@ -128,7 +129,7 @@ func handleSocks5(conn net.Conn, sconn net.Conn) { if err != nil { return } - log.Println(req) + //log.Println(req) switch req.Cmd { case gosocks5.CmdConnect, gosocks5.CmdBind: @@ -155,7 +156,7 @@ func handleSocks5(conn net.Conn, sconn net.Conn) { addr := ToSocksAddr(uconn.LocalAddr()) addr.Host, _, _ = net.SplitHostPort(conn.LocalAddr().String()) - log.Println("udp:", addr) + //log.Println("udp:", addr) rep = gosocks5.NewReply(Succeeded, addr) if err := rep.Write(conn); err != nil { @@ -163,15 +164,17 @@ func handleSocks5(conn net.Conn, sconn net.Conn) { return } - cliTunnelUDP(uconn, conn) + go cliTunnelUDP(uconn, sconn) + + ioutil.ReadAll(conn) } } -func cliTunnelUDP(uconn *net.UDPConn, conn net.Conn) { +func cliTunnelUDP(uconn *net.UDPConn, sconn net.Conn) { var raddr *net.UDPAddr go func() { - b := make([]byte, 65797) + b := make([]byte, 65535) for { n, addr, err := uconn.ReadFromUDP(b) if err != nil { @@ -185,9 +188,9 @@ func cliTunnelUDP(uconn *net.UDPConn, conn net.Conn) { return } udp.Header.Rsv = uint16(len(udp.Data)) - log.Println("r", raddr.String(), udp.Header) + //log.Println("r", raddr.String(), udp.Header) - if err := udp.Write(conn); err != nil { + if err := udp.Write(sconn); err != nil { log.Println(err) return } @@ -195,12 +198,12 @@ func cliTunnelUDP(uconn *net.UDPConn, conn net.Conn) { }() for { - udp, err := gosocks5.ReadUDPDatagram(conn) + udp, err := gosocks5.ReadUDPDatagram(sconn) if err != nil { log.Println(err) return } - log.Println("w", udp.Header) + //log.Println("w", udp.Header) udp.Header.Rsv = 0 buf := &bytes.Buffer{} udp.Write(buf) diff --git a/server.go b/server.go index 300e2fc..2b9c929 100644 --- a/server.go +++ b/server.go @@ -41,7 +41,7 @@ func srvHandle(conn net.Conn, method uint8) { switch req.Cmd { case gosocks5.CmdConnect: - log.Println("connect", req.Addr.String()) + //log.Println("connect", req.Addr.String()) tconn, err := Connect(req.Addr.String(), Proxy) if err != nil { gosocks5.NewReply(gosocks5.HostUnreachable, nil).Write(conn) @@ -66,7 +66,7 @@ func srvHandle(conn net.Conn, method uint8) { addr := ToSocksAddr(l.Addr()) addr.Host, _, _ = net.SplitHostPort(conn.LocalAddr().String()) - log.Println("bind:", addr) + //log.Println("bind:", addr) rep := gosocks5.NewReply(gosocks5.Succeeded, addr) if err := rep.Write(conn); err != nil { return @@ -82,6 +82,7 @@ func srvHandle(conn net.Conn, method uint8) { l.Close() addr = ToSocksAddr(tconn.RemoteAddr()) + log.Println("accept peer:", addr.String()) rep = gosocks5.NewReply(gosocks5.Succeeded, addr) if err := rep.Write(conn); err != nil { log.Println(err) @@ -102,7 +103,7 @@ func srvHandle(conn net.Conn, method uint8) { addr := ToSocksAddr(uconn.LocalAddr()) addr.Host, _, _ = net.SplitHostPort(conn.LocalAddr().String()) - log.Println("udp:", addr) + //log.Println("udp:", addr) rep := gosocks5.NewReply(Succeeded, addr) if err := rep.Write(conn); err != nil { log.Println(err) @@ -124,7 +125,7 @@ func srvTunnelUDP(conn net.Conn, uconn *net.UDPConn) { udp := gosocks5.NewUDPDatagram( gosocks5.NewUDPHeader(uint16(n), 0, ToSocksAddr(addr)), b[:n]) - log.Println("r", udp.Header) + //log.Println("r", udp.Header) if err := udp.Write(conn); err != nil { log.Println(err) return @@ -138,7 +139,7 @@ func srvTunnelUDP(conn net.Conn, uconn *net.UDPConn) { log.Println(err) return } - log.Println("w", udp.Header) + //log.Println("w", udp.Header) addr, err := net.ResolveUDPAddr("udp", udp.Header.Addr.String()) if err != nil { log.Println(err)