fix bug #27
This commit is contained in:
parent
a482f258da
commit
ee1fb89b8c
2
conn.go
2
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) {
|
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)
|
||||||
|
2
main.go
2
main.go
@ -18,7 +18,7 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
Version = "2.0-rc2"
|
Version = "2.0-rc3"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
45
socks.go
45
socks.go
@ -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()
|
glog.V(LINFO).Infoln("[udp] transfer done")
|
||||||
sc.Close()
|
} else {
|
||||||
glog.V(LINFO).Infoln("[udp] transfer done")
|
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
5
udp.go
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user