Skip to content

Commit 452fe25

Browse files
feat: SUDP alway reconnect and print too much log when no data ready (fatedier#2844)
* feat: random sleep duration before reconnecting * fix: bug
1 parent 63efa6b commit 452fe25

File tree

1 file changed

+28
-15
lines changed

1 file changed

+28
-15
lines changed

client/visitor.go

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -377,39 +377,44 @@ func (sv *SUDPVisitor) Run() (err error) {
377377
func (sv *SUDPVisitor) dispatcher() {
378378
xl := xlog.FromContextSafe(sv.ctx)
379379

380+
var (
381+
visitorConn net.Conn
382+
err error
383+
384+
firstPacket *msg.UDPPacket
385+
)
386+
380387
for {
381-
// loop for get frpc to frps tcp conn
382-
// setup worker
383-
// wait worker to finished
384-
// retry or exit
385-
visitorConn, err := sv.getNewVisitorConn()
386-
if err != nil {
387-
// check if proxy is closed
388-
// if checkCloseCh is close, we will return, other case we will continue to reconnect
389-
select {
390-
case <-sv.checkCloseCh:
388+
select {
389+
case firstPacket = <-sv.sendCh:
390+
if firstPacket == nil {
391391
xl.Info("frpc sudp visitor proxy is closed")
392392
return
393-
default:
394393
}
394+
case <-sv.checkCloseCh:
395+
xl.Info("frpc sudp visitor proxy is closed")
396+
return
397+
}
395398

396-
time.Sleep(3 * time.Second)
397-
399+
visitorConn, err = sv.getNewVisitorConn()
400+
if err != nil {
398401
xl.Warn("newVisitorConn to frps error: %v, try to reconnect", err)
399402
continue
400403
}
401404

402-
sv.worker(visitorConn)
405+
// visitorConn always be closed when worker done.
406+
sv.worker(visitorConn, firstPacket)
403407

404408
select {
405409
case <-sv.checkCloseCh:
406410
return
407411
default:
408412
}
409413
}
414+
410415
}
411416

412-
func (sv *SUDPVisitor) worker(workConn net.Conn) {
417+
func (sv *SUDPVisitor) worker(workConn net.Conn, firstPacket *msg.UDPPacket) {
413418
xl := xlog.FromContextSafe(sv.ctx)
414419
xl.Debug("starting sudp proxy worker")
415420

@@ -463,6 +468,14 @@ func (sv *SUDPVisitor) worker(workConn net.Conn) {
463468
}()
464469

465470
var errRet error
471+
if firstPacket != nil {
472+
if errRet = msg.WriteMsg(conn, firstPacket); errRet != nil {
473+
xl.Warn("sender goroutine for udp work connection closed: %v", errRet)
474+
return
475+
}
476+
xl.Trace("send udp package to workConn: %s", firstPacket.Content)
477+
}
478+
466479
for {
467480
select {
468481
case udpMsg, ok := <-sv.sendCh:

0 commit comments

Comments
 (0)