mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-15 09:10:25 +08:00
在edge-node conns命令中显示连接时长
This commit is contained in:
10
internal/conns/info.go
Normal file
10
internal/conns/info.go
Normal 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
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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":
|
||||||
|
|||||||
Reference in New Issue
Block a user