@@ -377,39 +377,44 @@ func (sv *SUDPVisitor) Run() (err error) {
377
377
func (sv * SUDPVisitor ) dispatcher () {
378
378
xl := xlog .FromContextSafe (sv .ctx )
379
379
380
+ var (
381
+ visitorConn net.Conn
382
+ err error
383
+
384
+ firstPacket * msg.UDPPacket
385
+ )
386
+
380
387
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 {
391
391
xl .Info ("frpc sudp visitor proxy is closed" )
392
392
return
393
- default :
394
393
}
394
+ case <- sv .checkCloseCh :
395
+ xl .Info ("frpc sudp visitor proxy is closed" )
396
+ return
397
+ }
395
398
396
- time . Sleep ( 3 * time . Second )
397
-
399
+ visitorConn , err = sv . getNewVisitorConn ( )
400
+ if err != nil {
398
401
xl .Warn ("newVisitorConn to frps error: %v, try to reconnect" , err )
399
402
continue
400
403
}
401
404
402
- sv .worker (visitorConn )
405
+ // visitorConn always be closed when worker done.
406
+ sv .worker (visitorConn , firstPacket )
403
407
404
408
select {
405
409
case <- sv .checkCloseCh :
406
410
return
407
411
default :
408
412
}
409
413
}
414
+
410
415
}
411
416
412
- func (sv * SUDPVisitor ) worker (workConn net.Conn ) {
417
+ func (sv * SUDPVisitor ) worker (workConn net.Conn , firstPacket * msg. UDPPacket ) {
413
418
xl := xlog .FromContextSafe (sv .ctx )
414
419
xl .Debug ("starting sudp proxy worker" )
415
420
@@ -463,6 +468,14 @@ func (sv *SUDPVisitor) worker(workConn net.Conn) {
463
468
}()
464
469
465
470
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
+
466
479
for {
467
480
select {
468
481
case udpMsg , ok := <- sv .sendCh :
0 commit comments