mirror of
https://github.com/fatedier/frp.git
synced 2025-07-16 10:51:45 +07:00
close all proxies if protocol = kcp
This commit is contained in:
@ -24,6 +24,7 @@ import (
|
||||
"github.com/fatedier/frp/models/config"
|
||||
"github.com/fatedier/frp/models/msg"
|
||||
"github.com/fatedier/frp/utils/crypto"
|
||||
"github.com/fatedier/frp/utils/errors"
|
||||
"github.com/fatedier/frp/utils/log"
|
||||
frpNet "github.com/fatedier/frp/utils/net"
|
||||
"github.com/fatedier/frp/utils/util"
|
||||
@ -69,8 +70,8 @@ type Control struct {
|
||||
// run id got from server
|
||||
runId string
|
||||
|
||||
// connection or other error happens , control will try to reconnect to server
|
||||
closed int32
|
||||
// if we call close() in control, do not reconnect to server
|
||||
exit bool
|
||||
|
||||
// goroutines can block by reading from this channel, it will be closed only in reader() when control connection is closed
|
||||
closedCh chan int
|
||||
@ -181,7 +182,10 @@ func (ctl *Control) NewWorkConn() {
|
||||
workConn.AddLogPrefix(startMsg.ProxyName)
|
||||
|
||||
// dispatch this work connection to related proxy
|
||||
if pxy, ok := ctl.proxies[startMsg.ProxyName]; ok {
|
||||
ctl.mu.RLock()
|
||||
pxy, ok := ctl.proxies[startMsg.ProxyName]
|
||||
ctl.mu.RUnlock()
|
||||
if ok {
|
||||
workConn.Debug("start a new work connection, localAddr: %s remoteAddr: %s", workConn.LocalAddr().String(), workConn.RemoteAddr().String())
|
||||
go pxy.InWorkConn(workConn)
|
||||
} else {
|
||||
@ -189,6 +193,20 @@ func (ctl *Control) NewWorkConn() {
|
||||
}
|
||||
}
|
||||
|
||||
func (ctl *Control) Close() error {
|
||||
ctl.mu.Lock()
|
||||
ctl.exit = true
|
||||
err := errors.PanicToError(func() {
|
||||
for name, _ := range ctl.proxies {
|
||||
ctl.sendCh <- &msg.CloseProxy{
|
||||
ProxyName: name,
|
||||
}
|
||||
}
|
||||
})
|
||||
ctl.mu.Unlock()
|
||||
return err
|
||||
}
|
||||
|
||||
func (ctl *Control) init() {
|
||||
ctl.sendCh = make(chan msg.Message, 10)
|
||||
ctl.readCh = make(chan msg.Message, 10)
|
||||
@ -377,7 +395,10 @@ func (ctl *Control) manager() {
|
||||
ctl.Warn("[%s] no proxy conf found", m.ProxyName)
|
||||
continue
|
||||
}
|
||||
|
||||
ctl.mu.RLock()
|
||||
oldPxy, ok := ctl.proxies[m.ProxyName]
|
||||
ctl.mu.RUnlock()
|
||||
if ok {
|
||||
oldPxy.Close()
|
||||
}
|
||||
@ -389,7 +410,9 @@ func (ctl *Control) manager() {
|
||||
}
|
||||
continue
|
||||
}
|
||||
ctl.mu.Lock()
|
||||
ctl.proxies[m.ProxyName] = pxy
|
||||
ctl.mu.Unlock()
|
||||
ctl.Info("[%s] start proxy success", m.ProxyName)
|
||||
case *msg.Pong:
|
||||
ctl.lastPong = time.Now()
|
||||
@ -429,6 +452,14 @@ func (ctl *Control) controler() {
|
||||
for _, pxy := range ctl.proxies {
|
||||
pxy.Close()
|
||||
}
|
||||
// if ctl.exit is true, just exit
|
||||
ctl.mu.RLock()
|
||||
exit := ctl.exit
|
||||
ctl.mu.RUnlock()
|
||||
if exit {
|
||||
return
|
||||
}
|
||||
|
||||
time.Sleep(time.Second)
|
||||
|
||||
// loop util reconnect to server success
|
||||
|
Reference in New Issue
Block a user