mirror of
https://github.com/shirou/gopsutil.git
synced 2025-04-28 13:48:49 +08:00

addresses a few things: - Windows has a concept of both a network "interface" and an "adapter" - These are almost always a one-to-one relationship, though there can be esoteric instances where they are not. - I believe the gopsutil NetIOCounters function should only return on a per-interface level, since this is the behavior on linux/darwin. Previously, the plugin was basically ignoring the actual interfaces returned from net.Interfaces(). Instead, it was looping over the net adapters for each interface, somewhat uselessly. FWIW, the code for getAdapterList() doesn't exist in the Go standard lib anymore. closes #245
90 lines
2.2 KiB
Go
90 lines
2.2 KiB
Go
// +build windows
|
|
|
|
package net
|
|
|
|
import (
|
|
"errors"
|
|
"net"
|
|
"os"
|
|
"syscall"
|
|
|
|
"github.com/shirou/gopsutil/internal/common"
|
|
)
|
|
|
|
var (
|
|
modiphlpapi = syscall.NewLazyDLL("iphlpapi.dll")
|
|
procGetExtendedTCPTable = modiphlpapi.NewProc("GetExtendedTcpTable")
|
|
procGetExtendedUDPTable = modiphlpapi.NewProc("GetExtendedUdpTable")
|
|
)
|
|
|
|
const (
|
|
TCPTableBasicListener = iota
|
|
TCPTableBasicConnections
|
|
TCPTableBasicAll
|
|
TCPTableOwnerPIDListener
|
|
TCPTableOwnerPIDConnections
|
|
TCPTableOwnerPIDAll
|
|
TCPTableOwnerModuleListener
|
|
TCPTableOwnerModuleConnections
|
|
TCPTableOwnerModuleAll
|
|
)
|
|
|
|
func IOCounters(pernic bool) ([]IOCountersStat, error) {
|
|
ifs, err := net.Interfaces()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var ret []IOCountersStat
|
|
|
|
for _, ifi := range ifs {
|
|
c := IOCountersStat{
|
|
Name: ifi.Name,
|
|
}
|
|
|
|
row := syscall.MibIfRow{Index: uint32(ifi.Index)}
|
|
e := syscall.GetIfEntry(&row)
|
|
if e != nil {
|
|
return nil, os.NewSyscallError("GetIfEntry", e)
|
|
}
|
|
c.BytesSent = uint64(row.OutOctets)
|
|
c.BytesRecv = uint64(row.InOctets)
|
|
c.PacketsSent = uint64(row.OutUcastPkts)
|
|
c.PacketsRecv = uint64(row.InUcastPkts)
|
|
c.Errin = uint64(row.InErrors)
|
|
c.Errout = uint64(row.OutErrors)
|
|
c.Dropin = uint64(row.InDiscards)
|
|
c.Dropout = uint64(row.OutDiscards)
|
|
|
|
ret = append(ret, c)
|
|
}
|
|
|
|
if pernic == false {
|
|
return getIOCountersAll(ret)
|
|
}
|
|
return ret, nil
|
|
}
|
|
|
|
// NetIOCountersByFile is an method which is added just a compatibility for linux.
|
|
func IOCountersByFile(pernic bool, filename string) ([]IOCountersStat, error) {
|
|
return IOCounters(pernic)
|
|
}
|
|
|
|
// Return a list of network connections opened by a process
|
|
func Connections(kind string) ([]ConnectionStat, error) {
|
|
var ret []ConnectionStat
|
|
|
|
return ret, common.ErrNotImplementedError
|
|
}
|
|
|
|
func FilterCounters() ([]FilterStat, error) {
|
|
return nil, errors.New("NetFilterCounters not implemented for windows")
|
|
}
|
|
|
|
// NetProtoCounters returns network statistics for the entire system
|
|
// If protocols is empty then all protocols are returned, otherwise
|
|
// just the protocols in the list are returned.
|
|
// Not Implemented for Windows
|
|
func ProtoCounters(protocols []string) ([]ProtoCountersStat, error) {
|
|
return nil, errors.New("NetProtoCounters not implemented for windows")
|
|
}
|