diff --git a/internal/conns/info.go b/internal/conns/info.go new file mode 100644 index 0000000..10f35ed --- /dev/null +++ b/internal/conns/info.go @@ -0,0 +1,10 @@ +// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . + +package conns + +import "net" + +type ConnInfo struct { + Conn net.Conn + CreatedAt int64 +} diff --git a/internal/conns/map.go b/internal/conns/map.go index afbaf0a..f7459dd 100644 --- a/internal/conns/map.go +++ b/internal/conns/map.go @@ -5,19 +5,20 @@ package conns import ( "net" "sync" + "time" ) var SharedMap = NewMap() type Map struct { - m map[string]map[int]net.Conn // ip => { port => Conn } + m map[string]map[int]*ConnInfo // ip => { port => ConnInfo } locker sync.RWMutex } func NewMap() *Map { return &Map{ - m: map[string]map[int]net.Conn{}, + m: map[string]map[int]*ConnInfo{}, } } @@ -33,15 +34,20 @@ func (this *Map) Add(conn net.Conn) { var ip = tcpAddr.IP.String() var port = tcpAddr.Port + var connInfo = &ConnInfo{ + Conn: conn, + CreatedAt: time.Now().Unix(), + } + this.locker.Lock() defer this.locker.Unlock() connMap, ok := this.m[ip] if !ok { - this.m[ip] = map[int]net.Conn{ - port: conn, + this.m[ip] = map[int]*ConnInfo{ + port: connInfo, } } else { - connMap[port] = conn + connMap[port] = connInfo } } @@ -86,8 +92,8 @@ func (this *Map) CloseIPConns(ip string) { // 复制,防止在Close时产生并发冲突 if ok { - for _, conn := range connMap { - conns = append(conns, conn) + for _, connInfo := range connMap { + conns = append(conns, connInfo.Conn) } } @@ -103,14 +109,14 @@ func (this *Map) CloseIPConns(ip string) { } } -func (this *Map) AllConns() []net.Conn { +func (this *Map) AllConns() []*ConnInfo { this.locker.RLock() defer this.locker.RUnlock() - var result = []net.Conn{} + var result = []*ConnInfo{} for _, m := range this.m { - for _, conn := range m { - result = append(result, conn) + for _, connInfo := range m { + result = append(result, connInfo) } } return result diff --git a/internal/nodes/node.go b/internal/nodes/node.go index 670e76f..9d65cb4 100644 --- a/internal/nodes/node.go +++ b/internal/nodes/node.go @@ -879,16 +879,19 @@ func (this *Node) listenSock() error { }, }) case "conns": - var addrs = []string{} + var connMaps = []maps.Map{} var connMap = conns.SharedMap.AllConns() - for _, conn := range connMap { - addrs = append(addrs, conn.RemoteAddr().String()) + for _, connInfo := range connMap { + connMaps = append(connMaps, maps.Map{ + "addr": connInfo.Conn.RemoteAddr().String(), + "age": time.Now().Unix() - connInfo.CreatedAt, + }) } _ = cmd.Reply(&gosock.Command{ Params: map[string]interface{}{ - "addrs": addrs, - "total": len(addrs), + "conns": connMaps, + "total": len(connMaps), }, }) case "dropIP":