在edge-node conns命令中显示连接时长

This commit is contained in:
刘祥超
2022-12-02 17:03:16 +08:00
parent 25b0b98bd4
commit 6fc30144f7
3 changed files with 35 additions and 16 deletions

10
internal/conns/info.go Normal file
View File

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

View File

@@ -5,19 +5,20 @@ package conns
import ( import (
"net" "net"
"sync" "sync"
"time"
) )
var SharedMap = NewMap() var SharedMap = NewMap()
type Map struct { 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 locker sync.RWMutex
} }
func NewMap() *Map { func NewMap() *Map {
return &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 ip = tcpAddr.IP.String()
var port = tcpAddr.Port var port = tcpAddr.Port
var connInfo = &ConnInfo{
Conn: conn,
CreatedAt: time.Now().Unix(),
}
this.locker.Lock() this.locker.Lock()
defer this.locker.Unlock() defer this.locker.Unlock()
connMap, ok := this.m[ip] connMap, ok := this.m[ip]
if !ok { if !ok {
this.m[ip] = map[int]net.Conn{ this.m[ip] = map[int]*ConnInfo{
port: conn, port: connInfo,
} }
} else { } else {
connMap[port] = conn connMap[port] = connInfo
} }
} }
@@ -86,8 +92,8 @@ func (this *Map) CloseIPConns(ip string) {
// 复制防止在Close时产生并发冲突 // 复制防止在Close时产生并发冲突
if ok { if ok {
for _, conn := range connMap { for _, connInfo := range connMap {
conns = append(conns, conn) 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() this.locker.RLock()
defer this.locker.RUnlock() defer this.locker.RUnlock()
var result = []net.Conn{} var result = []*ConnInfo{}
for _, m := range this.m { for _, m := range this.m {
for _, conn := range m { for _, connInfo := range m {
result = append(result, conn) result = append(result, connInfo)
} }
} }
return result return result

View File

@@ -879,16 +879,19 @@ func (this *Node) listenSock() error {
}, },
}) })
case "conns": case "conns":
var addrs = []string{} var connMaps = []maps.Map{}
var connMap = conns.SharedMap.AllConns() var connMap = conns.SharedMap.AllConns()
for _, conn := range connMap { for _, connInfo := range connMap {
addrs = append(addrs, conn.RemoteAddr().String()) connMaps = append(connMaps, maps.Map{
"addr": connInfo.Conn.RemoteAddr().String(),
"age": time.Now().Unix() - connInfo.CreatedAt,
})
} }
_ = cmd.Reply(&gosock.Command{ _ = cmd.Reply(&gosock.Command{
Params: map[string]interface{}{ Params: map[string]interface{}{
"addrs": addrs, "conns": connMaps,
"total": len(addrs), "total": len(connMaps),
}, },
}) })
case "dropIP": case "dropIP":