@markinaras

Какой командой узнать количество открытых tcp соединений?

Какой командой или как то иначе узнать количество открытых tcp соединений в данный момент в системе? Хочу в своей программе (на Golang) получать количество открытых tcp соединений, чтобы контролировать и не открывать сверх нормы (иначе провайдер блокирует). Можно парсить "netstat -s" это слишком медленно , но подумал может есть проще способ или переменная где-то лежит и можно обратится к ней напрямую?
  • Вопрос задан
  • 395 просмотров
Решения вопроса 1
@markinaras Автор вопроса
В гитхабе нашел код, с помощью которого можно получить сетевые данные. Число открытых 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)
		}
	}
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы