• Как начать использование асинхронного программирования?

    @markinaras
    Посмотри в youtube простые обьяснения async, threads и worker сначала по своему яп. Да и подумать стоит ли асинхрон использовать. Чтобы часть кода работала асинхронно, нужно ожидание(await) например: запрос к сети, к диску, сон и тд. Возможно тебе нужны все таки threads.
    Ответ написан
    Комментировать
  • Какой командой узнать количество открытых tcp соединений?

    @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)
    		}
    	}
    }
    Ответ написан
    Комментировать