From b73e4173a3c1e69e02ad6b4e3b43e425e57a5be9 Mon Sep 17 00:00:00 2001 From: MHSanaei Date: Thu, 9 Feb 2023 22:48:06 +0330 Subject: 3x-ui --- util/sys/a.s | 0 util/sys/psutil.go | 8 ++++++ util/sys/sys_darwin.go | 23 +++++++++++++++++ util/sys/sys_linux.go | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+) create mode 100644 util/sys/a.s create mode 100644 util/sys/psutil.go create mode 100644 util/sys/sys_darwin.go create mode 100644 util/sys/sys_linux.go (limited to 'util/sys') diff --git a/util/sys/a.s b/util/sys/a.s new file mode 100644 index 00000000..e69de29b diff --git a/util/sys/psutil.go b/util/sys/psutil.go new file mode 100644 index 00000000..645f839a --- /dev/null +++ b/util/sys/psutil.go @@ -0,0 +1,8 @@ +package sys + +import ( + _ "unsafe" +) + +//go:linkname HostProc github.com/shirou/gopsutil/internal/common.HostProc +func HostProc(combineWith ...string) string diff --git a/util/sys/sys_darwin.go b/util/sys/sys_darwin.go new file mode 100644 index 00000000..d61a38a2 --- /dev/null +++ b/util/sys/sys_darwin.go @@ -0,0 +1,23 @@ +// +build darwin + +package sys + +import ( + "github.com/shirou/gopsutil/net" +) + +func GetTCPCount() (int, error) { + stats, err := net.Connections("tcp") + if err != nil { + return 0, err + } + return len(stats), nil +} + +func GetUDPCount() (int, error) { + stats, err := net.Connections("udp") + if err != nil { + return 0, err + } + return len(stats), nil +} diff --git a/util/sys/sys_linux.go b/util/sys/sys_linux.go new file mode 100644 index 00000000..843d9b00 --- /dev/null +++ b/util/sys/sys_linux.go @@ -0,0 +1,70 @@ +// +build linux + +package sys + +import ( + "bytes" + "fmt" + "io" + "os" +) + +func getLinesNum(filename string) (int, error) { + file, err := os.Open(filename) + if err != nil { + return 0, err + } + defer file.Close() + + sum := 0 + buf := make([]byte, 8192) + for { + n, err := file.Read(buf) + + var buffPosition int + for { + i := bytes.IndexByte(buf[buffPosition:], '\n') + if i < 0 || n == buffPosition { + break + } + buffPosition += i + 1 + sum++ + } + + if err == io.EOF { + return sum, nil + } else if err != nil { + return sum, err + } + } +} + +func GetTCPCount() (int, error) { + root := HostProc() + + tcp4, err := getLinesNum(fmt.Sprintf("%v/net/tcp", root)) + if err != nil { + return tcp4, err + } + tcp6, err := getLinesNum(fmt.Sprintf("%v/net/tcp6", root)) + if err != nil { + return tcp4 + tcp6, nil + } + + return tcp4 + tcp6, nil +} + +func GetUDPCount() (int, error) { + root := HostProc() + + udp4, err := getLinesNum(fmt.Sprintf("%v/net/udp", root)) + if err != nil { + return udp4, err + } + udp6, err := getLinesNum(fmt.Sprintf("%v/net/udp6", root)) + if err != nil { + return udp4 + udp6, nil + } + + return udp4 + udp6, nil +} -- cgit v1.2.3