You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.4 KiB
120 lines
3.4 KiB
// +build windows |
|
|
|
package net |
|
|
|
import ( |
|
"context" |
|
"errors" |
|
"net" |
|
"os" |
|
|
|
"github.com/shirou/gopsutil/internal/common" |
|
"golang.org/x/sys/windows" |
|
) |
|
|
|
var ( |
|
modiphlpapi = windows.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) { |
|
return IOCountersWithContext(context.Background(), pernic) |
|
} |
|
|
|
func IOCountersWithContext(ctx context.Context, 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 := windows.MibIfRow{Index: uint32(ifi.Index)} |
|
e := windows.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 IOCountersByFileWithContext(context.Background(), pernic, filename) |
|
} |
|
|
|
func IOCountersByFileWithContext(ctx context.Context, 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) { |
|
return ConnectionsWithContext(context.Background(), kind) |
|
} |
|
|
|
func ConnectionsWithContext(ctx context.Context, kind string) ([]ConnectionStat, error) { |
|
var ret []ConnectionStat |
|
|
|
return ret, common.ErrNotImplementedError |
|
} |
|
|
|
// Return a list of network connections opened returning at most `max` |
|
// connections for each running process. |
|
func ConnectionsMax(kind string, max int) ([]ConnectionStat, error) { |
|
return ConnectionsMaxWithContext(context.Background(), kind, max) |
|
} |
|
|
|
func ConnectionsMaxWithContext(ctx context.Context, kind string, max int) ([]ConnectionStat, error) { |
|
return []ConnectionStat{}, common.ErrNotImplementedError |
|
} |
|
|
|
func FilterCounters() ([]FilterStat, error) { |
|
return FilterCountersWithContext(context.Background()) |
|
} |
|
|
|
func FilterCountersWithContext(ctx context.Context) ([]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 ProtoCountersWithContext(context.Background(), protocols) |
|
} |
|
|
|
func ProtoCountersWithContext(ctx context.Context, protocols []string) ([]ProtoCountersStat, error) { |
|
return nil, errors.New("NetProtoCounters not implemented for windows") |
|
}
|
|
|