This commit is contained in:
rui.zheng 2016-02-05 15:23:57 +08:00
parent a482f258da
commit ee1fb89b8c
4 changed files with 30 additions and 24 deletions

View File

@ -232,7 +232,7 @@ func Connect(addr string) (conn net.Conn, err error) {
func forwardChain(chain ...Args) (conn net.Conn, end Args, err error) { func forwardChain(chain ...Args) (conn net.Conn, end Args, err error) {
end = chain[0] 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 return
} }
c, err := forward(conn, end) c, err := forward(conn, end)

View File

@ -18,7 +18,7 @@ const (
) )
const ( const (
Version = "2.0-rc2" Version = "2.0-rc3"
) )
var ( var (

View File

@ -235,7 +235,7 @@ func handleSocks5Request(req *gosocks5.Request, conn net.Conn) {
return return
} }
cc = Client(conn, nil) 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 { } else {
b := udpPool.Get().([]byte) b := udpPool.Get().([]byte)
defer udpPool.Put(b) defer udpPool.Put(b)
@ -259,32 +259,31 @@ func handleSocks5Request(req *gosocks5.Request, conn net.Conn) {
glog.V(LWARNING).Infoln("socks5 udp:", err) glog.V(LWARNING).Infoln("socks5 udp:", err)
return 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) glog.V(LWARNING).Infoln("socks5 udp:", err)
return return
} }
dgram, err = sc.ReadUDPTimeout(time.Second * 60) dgram, err = sc.ReadUDPTimeout(time.Second * 90)
if err != nil { if err != nil {
glog.V(LWARNING).Infoln("socks5 udp:", err) glog.V(LWARNING).Infoln("socks5 udp:", err)
return 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) glog.V(LWARNING).Infoln("socks5 udp:", err)
return return
} }
if req.Cmd == gosocks5.CmdUdp { if req.Cmd == gosocks5.CmdUdp {
go func() { go TransportUDP(cc, sc)
ioutil.ReadAll(conn) ioutil.ReadAll(conn) // wait for client exit
cc.Close()
sc.Close()
glog.V(LINFO).Infoln("[udp] transfer done") glog.V(LINFO).Infoln("[udp] transfer done")
}() } else {
}
TransportUDP(cc, sc) TransportUDP(cc, sc)
}
default: default:
glog.V(LWARNING).Infoln("Unrecognized request: ", req) glog.V(LWARNING).Infoln("Unrecognized request: ", req)
} }
@ -317,6 +316,7 @@ func serveBind(conn net.Conn) error {
glog.V(LDEBUG).Infoln(rep) glog.V(LDEBUG).Infoln(rep)
glog.V(LINFO).Infoln("[socks5] BIND on", addr, "OK") 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() tconn, err := l.AcceptTCP()
l.Close() // only accept one peer l.Close() // only accept one peer
if err != nil { if err != nil {
@ -348,7 +348,7 @@ func serveBind(conn net.Conn) error {
func forwardBind(req *gosocks5.Request, conn net.Conn) error { func forwardBind(req *gosocks5.Request, conn net.Conn) error {
fconn, _, err := forwardChain(forwardArgs...) fconn, _, err := forwardChain(forwardArgs...)
if err != nil { 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 { if fconn != nil {
fconn.Close() fconn.Close()
} }
@ -372,18 +372,18 @@ func forwardBind(req *gosocks5.Request, conn net.Conn) error {
// first reply // first reply
rep, err := peekReply(conn, fconn) rep, err := peekReply(conn, fconn)
if err != nil { if err != nil {
glog.V(LWARNING).Infoln("[socks5] BIND(forward)", err) glog.V(LWARNING).Infoln("[socks5] BIND forward", err)
return 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 // second reply
rep, err = peekReply(conn, fconn) rep, err = peekReply(conn, fconn)
if err != nil { if err != nil {
glog.V(LWARNING).Infoln("[socks5] BIND(forward) accept", err) glog.V(LWARNING).Infoln("[socks5] BIND forward accept", err)
return 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) return Transport(conn, fconn)
} }
@ -460,13 +460,16 @@ func PipeUDP(src, dst *UDPConn, ch chan<- error) {
for { for {
var dgram *gosocks5.UDPDatagram var dgram *gosocks5.UDPDatagram
dgram, err = src.ReadUDPTimeout(time.Second * 60) dgram, err = src.ReadUDP()
if err != nil { if err != nil {
break break
} }
glog.V(LDEBUG).Infof("[udp] addr %s, length %d", dgram.Header.Addr, len(dgram.Data)) if src.isClient {
glog.V(LDEBUG).Infof("[udp] -> %s, length %d", dgram.Header.Addr, len(dgram.Data))
if err = dst.WriteUDPTimeout(dgram, time.Second*60); err != nil { } else {
glog.V(LDEBUG).Infof("[udp] <- %s, length %d", dgram.Header.Addr, len(dgram.Data))
}
if err = dst.WriteUDP(dgram); err != nil {
break break
} }
} }

5
udp.go
View File

@ -72,7 +72,10 @@ func (c *UDPConn) readUDPClient() (*gosocks5.UDPDatagram, error) {
func (c *UDPConn) readUDPServer() (*gosocks5.UDPDatagram, error) { func (c *UDPConn) readUDPServer() (*gosocks5.UDPDatagram, error) {
if c.udp != nil { 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) n, addr, err := c.udp.ReadFrom(b)
if err != nil { if err != nil {
return nil, err return nil, err