diff --git a/conn.go b/conn.go index e7e22a6..94908f3 100644 --- a/conn.go +++ b/conn.go @@ -232,7 +232,7 @@ func Connect(addr string) (conn net.Conn, err error) { func forwardChain(chain ...Args) (conn net.Conn, end Args, err error) { end = chain[0] - if conn, err = net.DialTimeout("tcp", end.Addr, time.Second*30); err != nil { + if conn, err = net.DialTimeout("tcp", end.Addr, time.Second*90); err != nil { return } c, err := forward(conn, end) diff --git a/main.go b/main.go index 50919ad..9a5aaff 100644 --- a/main.go +++ b/main.go @@ -18,7 +18,7 @@ const ( ) const ( - Version = "2.0-rc2" + Version = "2.0-rc3" ) var ( diff --git a/socks.go b/socks.go index 1b6ae77..ad04e54 100644 --- a/socks.go +++ b/socks.go @@ -235,7 +235,7 @@ func handleSocks5Request(req *gosocks5.Request, conn net.Conn) { return } cc = Client(conn, nil) - glog.V(LINFO).Infof("[udp] tunnel to %s, length %d", dgram.Header.Addr, len(dgram.Data)) + glog.V(LINFO).Infof("[udp] -> %s, length %d", dgram.Header.Addr, len(dgram.Data)) } else { b := udpPool.Get().([]byte) defer udpPool.Put(b) @@ -259,32 +259,31 @@ func handleSocks5Request(req *gosocks5.Request, conn net.Conn) { glog.V(LWARNING).Infoln("socks5 udp:", err) return } + defer sc.Close() - if err = sc.WriteUDPTimeout(dgram, time.Second*60); err != nil { + if err = sc.WriteUDPTimeout(dgram, time.Second*90); err != nil { glog.V(LWARNING).Infoln("socks5 udp:", err) return } - dgram, err = sc.ReadUDPTimeout(time.Second * 60) + dgram, err = sc.ReadUDPTimeout(time.Second * 90) if err != nil { glog.V(LWARNING).Infoln("socks5 udp:", err) return } - glog.V(LINFO).Infof("[udp] from %s, length %d", dgram.Header.Addr, len(dgram.Data)) + glog.V(LINFO).Infof("[udp] <- %s, length %d", dgram.Header.Addr, len(dgram.Data)) - if err = cc.WriteUDPTimeout(dgram, time.Second*60); err != nil { + if err = cc.WriteUDPTimeout(dgram, time.Second*90); err != nil { glog.V(LWARNING).Infoln("socks5 udp:", err) return } if req.Cmd == gosocks5.CmdUdp { - go func() { - ioutil.ReadAll(conn) - cc.Close() - sc.Close() - glog.V(LINFO).Infoln("[udp] transfer done") - }() + go TransportUDP(cc, sc) + ioutil.ReadAll(conn) // wait for client exit + glog.V(LINFO).Infoln("[udp] transfer done") + } else { + TransportUDP(cc, sc) } - TransportUDP(cc, sc) default: glog.V(LWARNING).Infoln("Unrecognized request: ", req) } @@ -317,6 +316,7 @@ func serveBind(conn net.Conn) error { glog.V(LDEBUG).Infoln(rep) glog.V(LINFO).Infoln("[socks5] BIND on", addr, "OK") + l.SetDeadline(time.Now().Add(time.Minute * 30)) // wait 30 minutes at most tconn, err := l.AcceptTCP() l.Close() // only accept one peer if err != nil { @@ -348,7 +348,7 @@ func serveBind(conn net.Conn) error { func forwardBind(req *gosocks5.Request, conn net.Conn) error { fconn, _, err := forwardChain(forwardArgs...) if err != nil { - glog.V(LWARNING).Infoln("[socks5] BIND(forward)", req.Addr, err) + glog.V(LWARNING).Infoln("[socks5] BIND forward", req.Addr, err) if fconn != nil { fconn.Close() } @@ -372,18 +372,18 @@ func forwardBind(req *gosocks5.Request, conn net.Conn) error { // first reply rep, err := peekReply(conn, fconn) if err != nil { - glog.V(LWARNING).Infoln("[socks5] BIND(forward)", err) + glog.V(LWARNING).Infoln("[socks5] BIND forward", err) return err } - glog.V(LINFO).Infoln("[socks5] BIND(forward) on", rep.Addr, "OK") + glog.V(LINFO).Infoln("[socks5] BIND forward on", rep.Addr, "OK") // second reply rep, err = peekReply(conn, fconn) if err != nil { - glog.V(LWARNING).Infoln("[socks5] BIND(forward) accept", err) + glog.V(LWARNING).Infoln("[socks5] BIND forward accept", err) return err } - glog.V(LINFO).Infoln("[socks5] BIND(forward) accept", rep.Addr) + glog.V(LINFO).Infoln("[socks5] BIND forward accept", rep.Addr) return Transport(conn, fconn) } @@ -460,13 +460,16 @@ func PipeUDP(src, dst *UDPConn, ch chan<- error) { for { var dgram *gosocks5.UDPDatagram - dgram, err = src.ReadUDPTimeout(time.Second * 60) + dgram, err = src.ReadUDP() if err != nil { break } - glog.V(LDEBUG).Infof("[udp] addr %s, length %d", dgram.Header.Addr, len(dgram.Data)) - - if err = dst.WriteUDPTimeout(dgram, time.Second*60); err != nil { + if src.isClient { + glog.V(LDEBUG).Infof("[udp] -> %s, length %d", dgram.Header.Addr, len(dgram.Data)) + } else { + glog.V(LDEBUG).Infof("[udp] <- %s, length %d", dgram.Header.Addr, len(dgram.Data)) + } + if err = dst.WriteUDP(dgram); err != nil { break } } diff --git a/udp.go b/udp.go index e3ce064..7ddeac1 100644 --- a/udp.go +++ b/udp.go @@ -72,7 +72,10 @@ func (c *UDPConn) readUDPClient() (*gosocks5.UDPDatagram, error) { func (c *UDPConn) readUDPServer() (*gosocks5.UDPDatagram, error) { if c.udp != nil { - b := make([]byte, 65535) + // b := make([]byte, 65535) + b := udpPool.Get().([]byte) + defer udpPool.Put(b) + n, addr, err := c.udp.ReadFrom(b) if err != nil { return nil, err