2021-09-06 02:03:27 -07:00
|
|
|
package proxy
|
2021-08-27 09:59:27 -07:00
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2021-09-13 03:14:11 -07:00
|
|
|
"log"
|
2021-08-27 09:59:27 -07:00
|
|
|
"net"
|
2021-09-05 03:56:21 -07:00
|
|
|
"sync"
|
2021-08-27 09:59:27 -07:00
|
|
|
|
|
|
|
"github.com/anon55555/mt"
|
|
|
|
)
|
|
|
|
|
2021-09-09 09:56:14 -07:00
|
|
|
var listeners map[*listener]struct{}
|
2021-09-09 09:30:43 -07:00
|
|
|
var listenersMu sync.RWMutex
|
|
|
|
var listenersOnce sync.Once
|
|
|
|
|
2021-09-09 09:56:14 -07:00
|
|
|
func allListeners() map[*listener]struct{} {
|
|
|
|
lm := make(map[*listener]struct{})
|
2021-09-09 09:30:43 -07:00
|
|
|
|
|
|
|
listenersMu.RLock()
|
|
|
|
defer listenersMu.RUnlock()
|
|
|
|
|
|
|
|
for l := range listeners {
|
|
|
|
lm[l] = struct{}{}
|
|
|
|
}
|
|
|
|
|
|
|
|
return lm
|
|
|
|
}
|
|
|
|
|
2021-09-09 09:56:14 -07:00
|
|
|
type listener struct {
|
2021-09-06 02:03:27 -07:00
|
|
|
mt.Listener
|
2021-09-06 09:26:24 -07:00
|
|
|
mu sync.RWMutex
|
2021-09-05 03:56:21 -07:00
|
|
|
|
2021-09-06 02:03:27 -07:00
|
|
|
clts map[*ClientConn]struct{}
|
2021-08-27 09:59:27 -07:00
|
|
|
}
|
|
|
|
|
2021-09-10 03:47:19 -07:00
|
|
|
func listen(pc net.PacketConn) *listener {
|
2021-09-09 09:56:14 -07:00
|
|
|
l := &listener{
|
2021-09-06 02:03:27 -07:00
|
|
|
Listener: mt.Listen(pc),
|
2021-09-06 09:26:24 -07:00
|
|
|
clts: make(map[*ClientConn]struct{}),
|
2021-08-27 09:59:27 -07:00
|
|
|
}
|
2021-09-09 09:30:43 -07:00
|
|
|
|
|
|
|
listenersMu.Lock()
|
|
|
|
defer listenersMu.Unlock()
|
|
|
|
|
|
|
|
listenersOnce.Do(func() {
|
2021-09-09 09:56:14 -07:00
|
|
|
listeners = make(map[*listener]struct{})
|
2021-09-09 09:30:43 -07:00
|
|
|
})
|
|
|
|
|
|
|
|
listeners[l] = struct{}{}
|
|
|
|
return l
|
2021-08-27 09:59:27 -07:00
|
|
|
}
|
|
|
|
|
2021-09-10 03:47:19 -07:00
|
|
|
func (l *listener) clients() map[*ClientConn]struct{} {
|
2021-09-06 02:03:27 -07:00
|
|
|
clts := make(map[*ClientConn]struct{})
|
|
|
|
|
|
|
|
l.mu.RLock()
|
|
|
|
defer l.mu.RUnlock()
|
2021-08-27 09:59:27 -07:00
|
|
|
|
2021-09-06 02:03:27 -07:00
|
|
|
for cc := range l.clts {
|
|
|
|
clts[cc] = struct{}{}
|
|
|
|
}
|
|
|
|
|
|
|
|
return clts
|
|
|
|
}
|
2021-08-27 09:59:27 -07:00
|
|
|
|
2021-09-10 03:47:19 -07:00
|
|
|
func (l *listener) accept() (*ClientConn, error) {
|
2021-09-06 02:03:27 -07:00
|
|
|
p, err := l.Listener.Accept()
|
2021-08-27 09:59:27 -07:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2021-09-13 03:14:11 -07:00
|
|
|
prefix := fmt.Sprintf("[%s] ", p.RemoteAddr())
|
2021-09-06 02:03:27 -07:00
|
|
|
cc := &ClientConn{
|
2021-08-27 09:59:27 -07:00
|
|
|
Peer: p,
|
2021-09-13 03:14:11 -07:00
|
|
|
logger: log.New(logWriter, prefix, log.LstdFlags|log.Lmsgprefix),
|
2021-08-27 09:59:27 -07:00
|
|
|
initCh: make(chan struct{}),
|
2021-09-01 04:27:53 -07:00
|
|
|
modChs: make(map[string]struct{}),
|
2021-08-27 09:59:27 -07:00
|
|
|
}
|
|
|
|
|
2021-09-05 03:56:21 -07:00
|
|
|
l.mu.Lock()
|
|
|
|
l.clts[cc] = struct{}{}
|
|
|
|
l.mu.Unlock()
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
<-cc.Closed()
|
|
|
|
l.mu.Lock()
|
|
|
|
defer l.mu.Unlock()
|
|
|
|
|
|
|
|
delete(l.clts, cc)
|
|
|
|
}()
|
|
|
|
|
2021-09-13 03:14:11 -07:00
|
|
|
cc.Log("->", "connect")
|
2021-08-27 09:59:27 -07:00
|
|
|
go handleClt(cc)
|
|
|
|
|
|
|
|
select {
|
|
|
|
case <-cc.Closed():
|
|
|
|
return nil, fmt.Errorf("%s is closed", cc.RemoteAddr())
|
|
|
|
default:
|
|
|
|
}
|
|
|
|
|
|
|
|
return cc, nil
|
|
|
|
}
|