В гитхабе нашел код, с помощью которого можно получить сетевые данные. Число открытых tcp соединений получает за 1-2 миллисекунды.
https://gist.github.com/adriansr/d2c1201be6bf2c203...
Немного изменил под себя.
package temp
import (
"fmt"
"syscall"
"unsafe"
"golang.org/x/sys/windows"
)
const (
iphlpapiDll = "iphlpapi.dll"
tcpFn = "GetExtendedTcpTable"
tcpTableOwnerPidAll = 1
)
func GetTcpCounter() int {
var tcp_counter int
moduleHandle, err := windows.LoadLibrary(iphlpapiDll)
if err != nil {
panic(err)
}
ptr, err := windows.GetProcAddress(moduleHandle, tcpFn)
if err != nil {
panic(err)
}
res, err := getNetTable(ptr, false, windows.AF_INET, tcpTableOwnerPidAll)
if err == nil {
if res != nil && len(res) >= 4 {
tcp_counter := int(*(*uint32)(unsafe.Pointer(&res[0])))
fmt.Println("tcp counter:", tcp_counter)
} else {
fmt.Printf("nil result!\n")
}
} else {
fmt.Printf("failed err = %v\n", err)
}
return tcp_counter
}
func getNetTable(fn uintptr, order bool, family int, class int) ([]byte, error) {
var sorted uintptr
if order {
sorted = 1
}
for size, ptr, addr := uint32(8), []byte(nil), uintptr(0); ; {
err, _, _ := syscall.Syscall6(fn, 5, addr, uintptr(unsafe.Pointer(&size)), sorted, uintptr(family), uintptr(class), 0)
if err == 0 {
return ptr, nil
} else if err == uintptr(syscall.ERROR_INSUFFICIENT_BUFFER) {
ptr = make([]byte, size)
addr = uintptr(unsafe.Pointer(&ptr[0]))
} else {
return nil, fmt.Errorf("getNetTable failed: %v", err)
}
}
}