diff --git a/constant/listener.go b/constant/listener.go new file mode 100644 index 00000000..07782a9e --- /dev/null +++ b/constant/listener.go @@ -0,0 +1,7 @@ +package constant + +type Listener interface { + RawAddress() string + Address() string + Close() error +} diff --git a/listener/http/server.go b/listener/http/server.go index 6c5a7f6a..bfdd9f1b 100644 --- a/listener/http/server.go +++ b/listener/http/server.go @@ -10,9 +10,26 @@ import ( type Listener struct { listener net.Listener + addr string closed bool } +// RawAddress implements C.Listener +func (l *Listener) RawAddress() string { + return l.addr +} + +// Address implements C.Listener +func (l *Listener) Address() string { + return l.listener.Addr().String() +} + +// Close implements C.Listener +func (l *Listener) Close() error { + l.closed = true + return l.listener.Close() +} + func New(addr string, in chan<- C.ConnContext) (*Listener, error) { return NewWithAuthenticate(addr, in, true) } @@ -30,6 +47,7 @@ func NewWithAuthenticate(addr string, in chan<- C.ConnContext, authenticate bool hl := &Listener{ listener: l, + addr: addr, } go func() { for { @@ -46,12 +64,3 @@ func NewWithAuthenticate(addr string, in chan<- C.ConnContext, authenticate bool return hl, nil } - -func (l *Listener) Close() { - l.closed = true - l.listener.Close() -} - -func (l *Listener) Address() string { - return l.listener.Addr().String() -} diff --git a/listener/listener.go b/listener/listener.go index 51ec3aa9..5c739c7e 100644 --- a/listener/listener.go +++ b/listener/listener.go @@ -87,7 +87,7 @@ func ReCreateHTTP(port int, tcpIn chan<- C.ConnContext) error { addr := genAddr(bindAddress, port, allowLan) if httpListener != nil { - if httpListener.Address() == addr { + if httpListener.RawAddress() == addr { return nil } httpListener.Close() @@ -118,7 +118,7 @@ func ReCreateSocks(port int, tcpIn chan<- C.ConnContext, udpIn chan<- *inbound.P shouldUDPIgnore := false if socksListener != nil { - if socksListener.Address() != addr { + if socksListener.RawAddress() != addr { socksListener.Close() socksListener = nil } else { @@ -127,7 +127,7 @@ func ReCreateSocks(port int, tcpIn chan<- C.ConnContext, udpIn chan<- *inbound.P } if socksUDPListener != nil { - if socksUDPListener.Address() != addr { + if socksUDPListener.RawAddress() != addr { socksUDPListener.Close() socksUDPListener = nil } else { @@ -168,7 +168,7 @@ func ReCreateRedir(port int, tcpIn chan<- C.ConnContext, udpIn chan<- *inbound.P addr := genAddr(bindAddress, port, allowLan) if redirListener != nil { - if redirListener.Address() == addr { + if redirListener.RawAddress() == addr { return nil } redirListener.Close() @@ -176,7 +176,7 @@ func ReCreateRedir(port int, tcpIn chan<- C.ConnContext, udpIn chan<- *inbound.P } if redirUDPListener != nil { - if redirUDPListener.Address() == addr { + if redirUDPListener.RawAddress() == addr { return nil } redirUDPListener.Close() @@ -209,7 +209,7 @@ func ReCreateTProxy(port int, tcpIn chan<- C.ConnContext, udpIn chan<- *inbound. addr := genAddr(bindAddress, port, allowLan) if tproxyListener != nil { - if tproxyListener.Address() == addr { + if tproxyListener.RawAddress() == addr { return nil } tproxyListener.Close() @@ -217,7 +217,7 @@ func ReCreateTProxy(port int, tcpIn chan<- C.ConnContext, udpIn chan<- *inbound. } if tproxyUDPListener != nil { - if tproxyUDPListener.Address() == addr { + if tproxyUDPListener.RawAddress() == addr { return nil } tproxyUDPListener.Close() @@ -253,7 +253,7 @@ func ReCreateMixed(port int, tcpIn chan<- C.ConnContext, udpIn chan<- *inbound.P shouldUDPIgnore := false if mixedListener != nil { - if mixedListener.Address() != addr { + if mixedListener.RawAddress() != addr { mixedListener.Close() mixedListener = nil } else { @@ -261,7 +261,7 @@ func ReCreateMixed(port int, tcpIn chan<- C.ConnContext, udpIn chan<- *inbound.P } } if mixedUDPLister != nil { - if mixedUDPLister.Address() != addr { + if mixedUDPLister.RawAddress() != addr { mixedUDPLister.Close() mixedUDPLister = nil } else { diff --git a/listener/mixed/mixed.go b/listener/mixed/mixed.go index 97be69f0..8fd4f990 100644 --- a/listener/mixed/mixed.go +++ b/listener/mixed/mixed.go @@ -15,8 +15,25 @@ import ( type Listener struct { listener net.Listener - closed bool + addr string cache *cache.Cache + closed bool +} + +// RawAddress implements C.Listener +func (l *Listener) RawAddress() string { + return l.addr +} + +// Address implements C.Listener +func (l *Listener) Address() string { + return l.listener.Addr().String() +} + +// Close implements C.Listener +func (l *Listener) Close() error { + l.closed = true + return l.listener.Close() } func New(addr string, in chan<- C.ConnContext) (*Listener, error) { @@ -27,6 +44,7 @@ func New(addr string, in chan<- C.ConnContext) (*Listener, error) { ml := &Listener{ listener: l, + addr: addr, cache: cache.New(30 * time.Second), } go func() { @@ -45,15 +63,6 @@ func New(addr string, in chan<- C.ConnContext) (*Listener, error) { return ml, nil } -func (l *Listener) Close() { - l.closed = true - l.listener.Close() -} - -func (l *Listener) Address() string { - return l.listener.Addr().String() -} - func handleConn(conn net.Conn, in chan<- C.ConnContext, cache *cache.Cache) { bufConn := N.NewBufferedConn(conn) head, err := bufConn.Peek(1) diff --git a/listener/redir/tcp.go b/listener/redir/tcp.go index f7160eb0..15c98a8f 100644 --- a/listener/redir/tcp.go +++ b/listener/redir/tcp.go @@ -9,9 +9,26 @@ import ( type Listener struct { listener net.Listener + addr string closed bool } +// RawAddress implements C.Listener +func (l *Listener) RawAddress() string { + return l.addr +} + +// Address implements C.Listener +func (l *Listener) Address() string { + return l.listener.Addr().String() +} + +// Close implements C.Listener +func (l *Listener) Close() error { + l.closed = true + return l.listener.Close() +} + func New(addr string, in chan<- C.ConnContext) (*Listener, error) { l, err := net.Listen("tcp", addr) if err != nil { @@ -19,6 +36,7 @@ func New(addr string, in chan<- C.ConnContext) (*Listener, error) { } rl := &Listener{ listener: l, + addr: addr, } go func() { @@ -37,15 +55,6 @@ func New(addr string, in chan<- C.ConnContext) (*Listener, error) { return rl, nil } -func (l *Listener) Close() { - l.closed = true - l.listener.Close() -} - -func (l *Listener) Address() string { - return l.listener.Addr().String() -} - func handleRedir(conn net.Conn, in chan<- C.ConnContext) { target, err := parserPacket(conn) if err != nil { diff --git a/listener/socks/tcp.go b/listener/socks/tcp.go index 20e48f85..49d0a1e3 100644 --- a/listener/socks/tcp.go +++ b/listener/socks/tcp.go @@ -15,9 +15,26 @@ import ( type Listener struct { listener net.Listener + addr string closed bool } +// RawAddress implements C.Listener +func (l *Listener) RawAddress() string { + return l.addr +} + +// Address implements C.Listener +func (l *Listener) Address() string { + return l.listener.Addr().String() +} + +// Close implements C.Listener +func (l *Listener) Close() error { + l.closed = true + return l.listener.Close() +} + func New(addr string, in chan<- C.ConnContext) (*Listener, error) { l, err := net.Listen("tcp", addr) if err != nil { @@ -26,6 +43,7 @@ func New(addr string, in chan<- C.ConnContext) (*Listener, error) { sl := &Listener{ listener: l, + addr: addr, } go func() { for { @@ -43,15 +61,6 @@ func New(addr string, in chan<- C.ConnContext) (*Listener, error) { return sl, nil } -func (l *Listener) Close() { - l.closed = true - l.listener.Close() -} - -func (l *Listener) Address() string { - return l.listener.Addr().String() -} - func handleSocks(conn net.Conn, in chan<- C.ConnContext) { bufConn := N.NewBufferedConn(conn) head, err := bufConn.Peek(1) diff --git a/listener/socks/udp.go b/listener/socks/udp.go index f822d76a..a2d21508 100644 --- a/listener/socks/udp.go +++ b/listener/socks/udp.go @@ -13,9 +13,26 @@ import ( type UDPListener struct { packetConn net.PacketConn + addr string closed bool } +// RawAddress implements C.Listener +func (l *UDPListener) RawAddress() string { + return l.addr +} + +// Address implements C.Listener +func (l *UDPListener) Address() string { + return l.packetConn.LocalAddr().String() +} + +// Close implements C.Listener +func (l *UDPListener) Close() error { + l.closed = true + return l.packetConn.Close() +} + func NewUDP(addr string, in chan<- *inbound.PacketAdapter) (*UDPListener, error) { l, err := net.ListenPacket("udp", addr) if err != nil { @@ -28,6 +45,7 @@ func NewUDP(addr string, in chan<- *inbound.PacketAdapter) (*UDPListener, error) sl := &UDPListener{ packetConn: l, + addr: addr, } go func() { for { @@ -47,15 +65,6 @@ func NewUDP(addr string, in chan<- *inbound.PacketAdapter) (*UDPListener, error) return sl, nil } -func (l *UDPListener) Close() error { - l.closed = true - return l.packetConn.Close() -} - -func (l *UDPListener) Address() string { - return l.packetConn.LocalAddr().String() -} - func handleSocksUDP(pc net.PacketConn, in chan<- *inbound.PacketAdapter, buf []byte, addr net.Addr) { target, payload, err := socks5.DecodeUDPPacket(buf) if err != nil { diff --git a/listener/tproxy/tproxy.go b/listener/tproxy/tproxy.go index 87f2d7d6..1a09f366 100644 --- a/listener/tproxy/tproxy.go +++ b/listener/tproxy/tproxy.go @@ -10,9 +10,32 @@ import ( type Listener struct { listener net.Listener + addr string closed bool } +// RawAddress implements C.Listener +func (l *Listener) RawAddress() string { + return l.addr +} + +// Address implements C.Listener +func (l *Listener) Address() string { + return l.listener.Addr().String() +} + +// Close implements C.Listener +func (l *Listener) Close() error { + l.closed = true + return l.listener.Close() +} + +func (l *Listener) handleTProxy(conn net.Conn, in chan<- C.ConnContext) { + target := socks5.ParseAddrToSocksAddr(conn.LocalAddr()) + conn.(*net.TCPConn).SetKeepAlive(true) + in <- inbound.NewSocket(target, conn, C.TPROXY) +} + func New(addr string, in chan<- C.ConnContext) (*Listener, error) { l, err := net.Listen("tcp", addr) if err != nil { @@ -32,6 +55,7 @@ func New(addr string, in chan<- C.ConnContext) (*Listener, error) { rl := &Listener{ listener: l, + addr: addr, } go func() { @@ -49,18 +73,3 @@ func New(addr string, in chan<- C.ConnContext) (*Listener, error) { return rl, nil } - -func (l *Listener) Close() { - l.closed = true - l.listener.Close() -} - -func (l *Listener) Address() string { - return l.listener.Addr().String() -} - -func (l *Listener) handleTProxy(conn net.Conn, in chan<- C.ConnContext) { - target := socks5.ParseAddrToSocksAddr(conn.LocalAddr()) - conn.(*net.TCPConn).SetKeepAlive(true) - in <- inbound.NewSocket(target, conn, C.TPROXY) -} diff --git a/listener/tproxy/udp.go b/listener/tproxy/udp.go index 6f9de6f5..f3d8dbb3 100644 --- a/listener/tproxy/udp.go +++ b/listener/tproxy/udp.go @@ -11,9 +11,26 @@ import ( type UDPListener struct { packetConn net.PacketConn + addr string closed bool } +// RawAddress implements C.Listener +func (l *UDPListener) RawAddress() string { + return l.addr +} + +// Address implements C.Listener +func (l *UDPListener) Address() string { + return l.packetConn.LocalAddr().String() +} + +// Close implements C.Listener +func (l *UDPListener) Close() error { + l.closed = true + return l.packetConn.Close() +} + func NewUDP(addr string, in chan<- *inbound.PacketAdapter) (*UDPListener, error) { l, err := net.ListenPacket("udp", addr) if err != nil { @@ -22,6 +39,7 @@ func NewUDP(addr string, in chan<- *inbound.PacketAdapter) (*UDPListener, error) rl := &UDPListener{ packetConn: l, + addr: addr, } c := l.(*net.UDPConn) @@ -60,15 +78,6 @@ func NewUDP(addr string, in chan<- *inbound.PacketAdapter) (*UDPListener, error) return rl, nil } -func (l *UDPListener) Close() error { - l.closed = true - return l.packetConn.Close() -} - -func (l *UDPListener) Address() string { - return l.packetConn.LocalAddr().String() -} - func handlePacketConn(pc net.PacketConn, in chan<- *inbound.PacketAdapter, buf []byte, lAddr *net.UDPAddr, rAddr *net.UDPAddr) { target := socks5.ParseAddrToSocksAddr(rAddr) pkt := &packet{