fix: close linstener
This commit is contained in:
parent
6fc62da7ae
commit
e9d8dd09ac
9 changed files with 23 additions and 18 deletions
|
@ -16,7 +16,7 @@ type AdvanceListener interface {
|
||||||
|
|
||||||
type NewListener interface {
|
type NewListener interface {
|
||||||
Name() string
|
Name() string
|
||||||
ReCreate(tcpIn chan<- ConnContext, udpIn chan<- PacketAdapter) error
|
Listen(tcpIn chan<- ConnContext, udpIn chan<- PacketAdapter) error
|
||||||
Close() error
|
Close() error
|
||||||
Address() string
|
Address() string
|
||||||
RawAddress() string
|
RawAddress() string
|
||||||
|
|
|
@ -138,11 +138,16 @@ func GetGeneral() *config.General {
|
||||||
func updateListeners(listeners map[string]C.NewListener) {
|
func updateListeners(listeners map[string]C.NewListener) {
|
||||||
tcpIn := tunnel.TCPIn()
|
tcpIn := tunnel.TCPIn()
|
||||||
udpIn := tunnel.UDPIn()
|
udpIn := tunnel.UDPIn()
|
||||||
|
for _, listener := range tunnel.Listeners() {
|
||||||
|
_ = listener.Close()
|
||||||
|
}
|
||||||
|
|
||||||
for _, listener := range listeners {
|
for _, listener := range listeners {
|
||||||
if err := listener.ReCreate(tcpIn, udpIn); err != nil {
|
if err := listener.Listen(tcpIn, udpIn); err != nil {
|
||||||
log.Errorln("Listener %s listen err: %s", listener.Name(), err.Error())
|
log.Errorln("Listener %s listen err: %s", listener.Name(), err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
tunnel.UpdateListeners(listeners)
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateExperimental(c *config.Config) {
|
func updateExperimental(c *config.Config) {
|
||||||
|
|
|
@ -52,7 +52,7 @@ func (b *Base) RawAddress() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReCreate implements constant.NewListener
|
// ReCreate implements constant.NewListener
|
||||||
func (*Base) ReCreate(tcpIn chan<- C.ConnContext, udpIn chan<- C.PacketAdapter) error {
|
func (*Base) Listen(tcpIn chan<- C.ConnContext, udpIn chan<- C.PacketAdapter) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,9 +30,8 @@ func (h *HTTP) Address() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReCreate implements constant.NewListener
|
// ReCreate implements constant.NewListener
|
||||||
func (h *HTTP) ReCreate(tcpIn chan<- C.ConnContext, udpIn chan<- C.PacketAdapter) error {
|
func (h *HTTP) Listen(tcpIn chan<- C.ConnContext, udpIn chan<- C.PacketAdapter) error {
|
||||||
var err error
|
var err error
|
||||||
_ = h.Close()
|
|
||||||
h.l, err = http.NewWithInfos(h.RawAddress(), h.name, h.preferRulesName, tcpIn)
|
h.l, err = http.NewWithInfos(h.RawAddress(), h.name, h.preferRulesName, tcpIn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -39,9 +39,8 @@ func (m *Mixed) Address() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReCreate implements constant.NewListener
|
// ReCreate implements constant.NewListener
|
||||||
func (m *Mixed) ReCreate(tcpIn chan<- C.ConnContext, udpIn chan<- C.PacketAdapter) error {
|
func (m *Mixed) Listen(tcpIn chan<- C.ConnContext, udpIn chan<- C.PacketAdapter) error {
|
||||||
var err error
|
var err error
|
||||||
_ = m.Close()
|
|
||||||
m.l, err = mixed.NewWithInfos(m.RawAddress(), m.name, m.preferRulesName, tcpIn)
|
m.l, err = mixed.NewWithInfos(m.RawAddress(), m.name, m.preferRulesName, tcpIn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -31,9 +31,8 @@ func (r *Redir) Address() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReCreate implements constant.NewListener
|
// ReCreate implements constant.NewListener
|
||||||
func (r *Redir) ReCreate(tcpIn chan<- C.ConnContext, udpIn chan<- C.PacketAdapter) error {
|
func (r *Redir) Listen(tcpIn chan<- C.ConnContext, udpIn chan<- C.PacketAdapter) error {
|
||||||
var err error
|
var err error
|
||||||
_ = r.Close()
|
|
||||||
r.l, err = redir.NewWithInfos(r.Address(), r.name, r.preferRulesName, tcpIn)
|
r.l, err = redir.NewWithInfos(r.Address(), r.name, r.preferRulesName, tcpIn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -2,8 +2,6 @@ package inbound
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"sync"
|
|
||||||
|
|
||||||
C "github.com/Dreamacro/clash/constant"
|
C "github.com/Dreamacro/clash/constant"
|
||||||
"github.com/Dreamacro/clash/listener/socks"
|
"github.com/Dreamacro/clash/listener/socks"
|
||||||
"github.com/Dreamacro/clash/log"
|
"github.com/Dreamacro/clash/log"
|
||||||
|
@ -16,7 +14,6 @@ type SocksOption struct {
|
||||||
|
|
||||||
type Socks struct {
|
type Socks struct {
|
||||||
*Base
|
*Base
|
||||||
mux sync.Mutex
|
|
||||||
udp bool
|
udp bool
|
||||||
stl *socks.Listener
|
stl *socks.Listener
|
||||||
sul *socks.UDPListener
|
sul *socks.UDPListener
|
||||||
|
@ -60,11 +57,8 @@ func (s *Socks) Address() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReCreate implements constant.NewListener
|
// ReCreate implements constant.NewListener
|
||||||
func (s *Socks) ReCreate(tcpIn chan<- C.ConnContext, udpIn chan<- C.PacketAdapter) error {
|
func (s *Socks) Listen(tcpIn chan<- C.ConnContext, udpIn chan<- C.PacketAdapter) error {
|
||||||
s.mux.Lock()
|
|
||||||
defer s.mux.Unlock()
|
|
||||||
var err error
|
var err error
|
||||||
_ = s.Close()
|
|
||||||
if s.stl, err = socks.NewWithInfos(s.RawAddress(), s.name, s.preferRulesName, tcpIn); err != nil {
|
if s.stl, err = socks.NewWithInfos(s.RawAddress(), s.name, s.preferRulesName, tcpIn); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,9 +38,8 @@ func (t *TProxy) Address() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReCreate implements constant.NewListener
|
// ReCreate implements constant.NewListener
|
||||||
func (t *TProxy) ReCreate(tcpIn chan<- C.ConnContext, udpIn chan<- C.PacketAdapter) error {
|
func (t *TProxy) Listen(tcpIn chan<- C.ConnContext, udpIn chan<- C.PacketAdapter) error {
|
||||||
var err error
|
var err error
|
||||||
_ = t.Close()
|
|
||||||
t.lTCP, err = tproxy.NewWithInfos(t.RawAddress(), t.name, t.preferRulesName, tcpIn)
|
t.lTCP, err = tproxy.NewWithInfos(t.RawAddress(), t.name, t.preferRulesName, tcpIn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -29,6 +29,7 @@ var (
|
||||||
udpQueue = make(chan C.PacketAdapter, 200)
|
udpQueue = make(chan C.PacketAdapter, 200)
|
||||||
natTable = nat.New()
|
natTable = nat.New()
|
||||||
rules []C.Rule
|
rules []C.Rule
|
||||||
|
listeners = make(map[string]C.NewListener)
|
||||||
subRules map[string][]C.Rule
|
subRules map[string][]C.Rule
|
||||||
proxies = make(map[string]C.Proxy)
|
proxies = make(map[string]C.Proxy)
|
||||||
providers map[string]provider.ProxyProvider
|
providers map[string]provider.ProxyProvider
|
||||||
|
@ -86,6 +87,9 @@ func Rules() []C.Rule {
|
||||||
return rules
|
return rules
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Listeners()map[string]C.NewListener{
|
||||||
|
return listeners
|
||||||
|
}
|
||||||
// UpdateRules handle update rules
|
// UpdateRules handle update rules
|
||||||
func UpdateRules(newRules []C.Rule, newSubRule map[string][]C.Rule, rp map[string]provider.RuleProvider) {
|
func UpdateRules(newRules []C.Rule, newSubRule map[string][]C.Rule, rp map[string]provider.RuleProvider) {
|
||||||
configMux.Lock()
|
configMux.Lock()
|
||||||
|
@ -118,6 +122,12 @@ func UpdateProxies(newProxies map[string]C.Proxy, newProviders map[string]provid
|
||||||
configMux.Unlock()
|
configMux.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func UpdateListeners(newListeners map[string]C.NewListener) {
|
||||||
|
configMux.Lock()
|
||||||
|
defer configMux.Unlock()
|
||||||
|
listeners=newListeners
|
||||||
|
}
|
||||||
|
|
||||||
func UpdateSniffer(dispatcher *sniffer.SnifferDispatcher) {
|
func UpdateSniffer(dispatcher *sniffer.SnifferDispatcher) {
|
||||||
configMux.Lock()
|
configMux.Lock()
|
||||||
sniffer.Dispatcher = dispatcher
|
sniffer.Dispatcher = dispatcher
|
||||||
|
|
Loading…
Reference in a new issue