diff --git a/conn.go b/conn.go index d217c1f..944e6ef 100644 --- a/conn.go +++ b/conn.go @@ -52,30 +52,3 @@ func relay(left, right net.Conn) (int64, int64, error) { } return n, rs.N, err } - -// copy from src to dst at target with read timeout -func timedCopy(dst net.PacketConn, target net.Addr, src net.PacketConn, timeout time.Duration, srcIncluded bool) error { - buf := make([]byte, udpBufSize) - - for { - src.SetReadDeadline(time.Now().Add(timeout)) - n, raddr, err := src.ReadFrom(buf) - if err != nil { - return err - } - - if srcIncluded { // server -> client: add original packet source - srcAddr := ParseAddr(raddr.String()) - copy(buf[len(srcAddr):], buf[:n]) - copy(buf, srcAddr) - _, err = dst.WriteTo(buf[:len(srcAddr)+n], target) - } else { // client -> user: strip original packet source - srcAddr := SplitAddr(buf[:n]) - _, err = dst.WriteTo(buf[len(srcAddr):n], target) - } - - if err != nil { - return err - } - } -} diff --git a/rule.go b/rule.go index bb24e61..21451f4 100644 --- a/rule.go +++ b/rule.go @@ -63,7 +63,7 @@ func (p *RuleDialer) NextDialer(dstAddr string) Dialer { host, _, err := net.SplitHostPort(dstAddr) if err != nil { // TODO: check here - logf("SplitHostPort ERROR: %s", err) + // logf("proxy-rule SplitHostPort ERROR: %s", err) return p.gDialer } diff --git a/ss.go b/ss.go index 965576d..cf71d49 100644 --- a/ss.go +++ b/ss.go @@ -71,8 +71,12 @@ func (s *SS) Serve(c net.Conn) { return } - // udp over tcp - if UoT(tgt[0]) { + dialer := s.sDialer.NextDialer("") + + // udp over tcp? + uot := UoT(tgt[0]) + if uot && dialer.Addr() == "DIRECT" { + rc, err := net.ListenPacket("udp", "") if err != nil { logf("UDP remote listen error: %v", err) @@ -102,7 +106,12 @@ func (s *SS) Serve(c net.Conn) { return } - rc, err := s.sDialer.Dial("tcp", tgt.String()) + network := "tcp" + if uot { + network = "udp" + } + + rc, err := dialer.Dial(network, tgt.String()) if err != nil { logf("proxy-ss failed to connect to target: %v", err) return