From be7c7d229de517998ece2f88f69f6e604b3219ab Mon Sep 17 00:00:00 2001 From: blizard863 <760076784@qq.com> Date: Tue, 15 Mar 2022 09:43:49 +0800 Subject: [PATCH] feat: random sleep duration before reconnecting --- client/visitor.go | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/client/visitor.go b/client/visitor.go index 52f4ccd9..a33acf0e 100644 --- a/client/visitor.go +++ b/client/visitor.go @@ -377,28 +377,46 @@ func (sv *SUDPVisitor) Run() (err error) { func (sv *SUDPVisitor) dispatcher() { xl := xlog.FromContextSafe(sv.ctx) + var ( + visitorConn net.Conn + err error + ) + for { // loop for get frpc to frps tcp conn // setup worker // wait worker to finished // retry or exit - visitorConn, err := sv.getNewVisitorConn() + + if len(sv.sendCh) > 0 { + visitorConn, err = sv.getNewVisitorConn() // connect to frps when data is ready + } else { + time.Sleep(time.Second) + continue + } + if err != nil { + // release all sendCh data // check if proxy is closed // if checkCloseCh is close, we will return, other case we will continue to reconnect - select { - case <-sv.checkCloseCh: - xl.Info("frpc sudp visitor proxy is closed") - return - default: + for { + if len(sv.sendCh) == 0 { + break + } + select { + case <-sv.sendCh: + case <-sv.checkCloseCh: + xl.Info("frpc sudp visitor proxy is closed") + return + default: + } } - time.Sleep(3 * time.Second) - xl.Warn("newVisitorConn to frps error: %v, try to reconnect", err) continue } + // visitorConn always be closed when worker done. sv.worker(visitorConn) select {