diff --git a/cmd/tun2socks/main.go b/cmd/tun2socks/main.go index b9ab8a2..5051ece 100644 --- a/cmd/tun2socks/main.go +++ b/cmd/tun2socks/main.go @@ -21,6 +21,8 @@ import ( const MTU = 1500 +var tcpConnections int64 = 0 + var ( version = "unknown version" description = "A tun2socks implementation written in Go." diff --git a/cmd/tun2socks/main_socks.go b/cmd/tun2socks/main_socks.go index d4c2b61..0f3c5bc 100644 --- a/cmd/tun2socks/main_socks.go +++ b/cmd/tun2socks/main_socks.go @@ -17,6 +17,9 @@ func init() { args.UdpTimeout = flag.Duration("udpTimeout", 1*time.Minute, "UDP session timeout") registerHandlerCreator("socks", func() { + // + socks.ActiveConnections = &tcpConnections + // Verify proxy server address. proxyAddr, err := net.ResolveTCPAddr("tcp", *args.ProxyServer) if err != nil { diff --git a/cmd/tun2socks/main_stats.go b/cmd/tun2socks/main_stats.go index 9a53f2f..59dda82 100644 --- a/cmd/tun2socks/main_stats.go +++ b/cmd/tun2socks/main_stats.go @@ -18,6 +18,8 @@ func init() { session.StatsAddr = *args.StatsAddr session.StatsVersion = version + session.ActiveConnections = &tcpConnections + sessionStater = session.NewSimpleSessionStater() sessionStater.Start() } else { diff --git a/common/stats/session/session.go b/common/stats/session/session.go index 9817863..4dc4222 100644 --- a/common/stats/session/session.go +++ b/common/stats/session/session.go @@ -19,6 +19,8 @@ import ( const maxCompletedSessions = 100 +var ActiveConnections *int64 + var ( StatsAddr = "localhost:6001" StatsPath = "/stats/session/plain" @@ -84,7 +86,7 @@ func (s *simpleSessionStater) Start() error { }
Active sessions %d
", len(sessions)) + _, _ = fmt.Fprintf(w, "Active sessions %d (%d)
", len(sessions), atomic.LoadInt64(ActiveConnections)) tablePrint(w, sessions) _, _ = fmt.Fprintf(w, "Recently completed sessions %d
", len(s.completedSessions)) diff --git a/proxy/socks/tcp.go b/proxy/socks/tcp.go index 35ad39f..35d6f62 100644 --- a/proxy/socks/tcp.go +++ b/proxy/socks/tcp.go @@ -5,6 +5,7 @@ import ( "net" "strconv" "sync" + "sync/atomic" "time" "golang.org/x/net/proxy" @@ -16,6 +17,8 @@ import ( "github.com/xjasonlyu/tun2socks/core" ) +var ActiveConnections *int64 + type tcpHandler struct { sync.Mutex @@ -110,6 +113,9 @@ func (h *tcpHandler) relay(localConn, remoteConn net.Conn, sess *stats.Session) if h.sessionStater != nil { h.sessionStater.RemoveSession(localConn) } + + // add -1 + atomic.AddInt64(ActiveConnections, -1) } func (h *tcpHandler) Handle(localConn net.Conn, target *net.TCPAddr) error { @@ -163,6 +169,9 @@ func (h *tcpHandler) Handle(localConn net.Conn, target *net.TCPAddr) error { // relay connections go h.relay(localConn, remoteConn, sess) + // add 1 + atomic.AddInt64(ActiveConnections, 1) + log.Access(process, "proxy", target.Network(), localConn.LocalAddr().String(), targetAddr) return nil }