diff --git a/README.md b/README.md index b805e90..9b94201 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ Proxy是golang实现的高性能http,https,websocket,tcp,udp,socks5代理服务 - [v3.0手册](https://github.com/snail007/goproxy/tree/v3.0) - [v2.x手册](https://github.com/snail007/goproxy/tree/v2.2) +* auto-gen TOC: {:toc} ### Fast Start diff --git a/services/socks.go b/services/socks.go index 38322c2..92a082d 100644 --- a/services/socks.go +++ b/services/socks.go @@ -393,19 +393,29 @@ func (s *Socks) proxyTCP(inConn *net.Conn, methodReq socks.MethodsRequest, reque defer utils.CloseConn(&outConn) var err interface{} useProxy := true - if *s.cfg.Always { - outConn, err = s.getOutConn(methodReq.Bytes(), request.Bytes(), request.Addr()) - } else { - if *s.cfg.Parent != "" { - s.checker.Add(request.Addr(), true, "", "", nil) - useProxy, _, _ = s.checker.IsBlocked(request.Addr()) - if useProxy { - outConn, err = s.getOutConn(methodReq.Bytes(), request.Bytes(), request.Addr()) + tryCount := 0 + maxTryCount := 3 + for { + if *s.cfg.Always { + outConn, err = s.getOutConn(methodReq.Bytes(), request.Bytes(), request.Addr()) + } else { + if *s.cfg.Parent != "" { + s.checker.Add(request.Addr(), true, "", "", nil) + useProxy, _, _ = s.checker.IsBlocked(request.Addr()) + if useProxy { + outConn, err = s.getOutConn(methodReq.Bytes(), request.Bytes(), request.Addr()) + } else { + outConn, err = utils.ConnectHost(request.Addr(), *s.cfg.Timeout) + } } else { outConn, err = utils.ConnectHost(request.Addr(), *s.cfg.Timeout) } + } + tryCount++ + if err == nil || tryCount > maxTryCount { + break } else { - outConn, err = utils.ConnectHost(request.Addr(), *s.cfg.Timeout) + log.Printf("get out conn fail,%s,retrying...", err) } } if err != nil {