diff --git a/pkg/relay/tcp.go b/pkg/relay/tcp.go index 4431841..9e16349 100644 --- a/pkg/relay/tcp.go +++ b/pkg/relay/tcp.go @@ -45,7 +45,7 @@ func (r *TCPRelay) ListenAndServe() error { if err != nil { return err } - go func(c *net.TCPConn) { + go func() { defer c.Close() r.ConnFunc(c.RemoteAddr()) rc, err := r.HyClient.DialTCP(r.Remote) @@ -56,6 +56,6 @@ func (r *TCPRelay) ListenAndServe() error { defer rc.Close() err = utils.PipePairWithTimeout(c, rc, r.Timeout) r.ErrorFunc(c.RemoteAddr(), err) - }(c) + }() } } diff --git a/pkg/socks5/server.go b/pkg/socks5/server.go index 99771a4..202c903 100644 --- a/pkg/socks5/server.go +++ b/pkg/socks5/server.go @@ -124,7 +124,7 @@ func (s *Server) ListenAndServe() error { if err != nil { return err } - go func(c *net.TCPConn) { + go func() { defer c.Close() if s.TCPTimeout != 0 { if err := c.SetDeadline(time.Now().Add(s.TCPTimeout)); err != nil { @@ -139,7 +139,7 @@ func (s *Server) ListenAndServe() error { return } _ = s.handle(c, r) - }(c) + }() } } @@ -327,10 +327,13 @@ func (s *Server) udpServer(clientConn *net.UDPConn, localRelayConn *net.UDPConn, go func() { buf := make([]byte, udpBufferSize) for { - n, _, err := localRelayConn.ReadFrom(buf) + n, from, err := localRelayConn.ReadFrom(buf) if n > 0 { - d := socks5.NewDatagram(socks5.ATYPIPv4, - []byte{0x00, 0x00, 0x00, 0x00}, []byte{0x00, 0x00}, buf[:n]) + atyp, addr, port, err := socks5.ParseAddress(from.String()) + if err != nil { + continue + } + d := socks5.NewDatagram(atyp, addr, port, buf[:n]) _, _ = clientConn.WriteToUDP(d.Bytes(), clientAddr) } if err != nil {