fix: close linstener

This commit is contained in:
Skyxim 2022-12-04 15:15:23 +08:00
parent 6fc62da7ae
commit e9d8dd09ac
9 changed files with 23 additions and 18 deletions

View file

@ -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

View file

@ -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) {

View file

@ -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
} }

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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
} }

View file

@ -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

View file

@ -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