diff --git a/client.go b/client.go index 898c687..a346b85 100644 --- a/client.go +++ b/client.go @@ -128,6 +128,7 @@ func handleSocks5(conn net.Conn, sconn net.Conn) { if err != nil { return } + log.Println(req) switch req.Cmd { case gosocks5.CmdConnect, gosocks5.CmdBind: @@ -162,28 +163,34 @@ func handleSocks5(conn net.Conn, sconn net.Conn) { return } - addr.Port = req.Addr.Port - raddr, err := net.ResolveUDPAddr("udp", addr.String()) - if err != nil { - return - } - - cliTunnelUDP(raddr, uconn, conn) + cliTunnelUDP(uconn, conn) } } -func cliTunnelUDP(raddr net.Addr, uconn *net.UDPConn, conn net.Conn) { - go func() { - udp, err := gosocks5.ReadUDPDatagram(uconn) - if err != nil { - log.Println(err) - return - } - udp.Header.Rsv = uint16(len(udp.Data)) +func cliTunnelUDP(uconn *net.UDPConn, conn net.Conn) { + var raddr *net.UDPAddr - if err := udp.Write(conn); err != nil { - log.Println(err) - return + go func() { + b := make([]byte, 65797) + for { + n, addr, err := uconn.ReadFromUDP(b) + if err != nil { + log.Println(err) + return + } + raddr = addr + r := bytes.NewBuffer(b[:n]) + udp, err := gosocks5.ReadUDPDatagram(r) + if err != nil { + return + } + udp.Header.Rsv = uint16(len(udp.Data)) + log.Println("r", raddr.String(), udp.Header) + + if err := udp.Write(conn); err != nil { + log.Println(err) + return + } } }() @@ -193,10 +200,10 @@ func cliTunnelUDP(raddr net.Addr, uconn *net.UDPConn, conn net.Conn) { log.Println(err) return } + log.Println("w", udp.Header) udp.Header.Rsv = 0 buf := &bytes.Buffer{} udp.Write(buf) - if _, err := uconn.WriteTo(buf.Bytes(), raddr); err != nil { log.Println(err) return diff --git a/server.go b/server.go index 45c469a..300e2fc 100644 --- a/server.go +++ b/server.go @@ -115,34 +115,37 @@ func srvHandle(conn net.Conn, method uint8) { func srvTunnelUDP(conn net.Conn, uconn *net.UDPConn) { go func() { b := make([]byte, 65535) - n, addr, err := uconn.ReadFromUDP(b) - if err != nil { - log.Println(err) - return - } + for { + n, addr, err := uconn.ReadFromUDP(b) + if err != nil { + log.Println(err) + return + } - udp := gosocks5.NewUDPDatagram( - gosocks5.NewUDPHeader(uint16(n), 0, ToSocksAddr(addr)), b[:n]) - if err := udp.Write(conn); err != nil { - log.Println(err) - return + udp := gosocks5.NewUDPDatagram( + gosocks5.NewUDPHeader(uint16(n), 0, ToSocksAddr(addr)), b[:n]) + log.Println("r", udp.Header) + if err := udp.Write(conn); err != nil { + log.Println(err) + return + } } }() for { - ud, err := gosocks5.ReadUDPDatagram(conn) + udp, err := gosocks5.ReadUDPDatagram(conn) if err != nil { log.Println(err) return } - - addr, err := net.ResolveUDPAddr("udp", ud.Header.Addr.String()) + log.Println("w", udp.Header) + addr, err := net.ResolveUDPAddr("udp", udp.Header.Addr.String()) if err != nil { log.Println(err) continue // drop silently } - if _, err := uconn.WriteToUDP(ud.Data, addr); err != nil { + if _, err := uconn.WriteToUDP(udp.Data, addr); err != nil { log.Println(err) return }