windows下一般都是通过IP Helper系列API接口获取网络状态,获取链接状况的接口是GetExtendedTcpTable
DWORD GetExtendedTcpTable(
__out PVOID pTcpTable,
__inout PDWORD pdwSize,
__in BOOL bOrder,
__in ULONG ulAf,
__in TCP_TABLE_CLASS TableClass,
__in ULONG Reserved
);
MSDN的地址是:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365928(v=vs.85).aspx
先传递空Buffer(*pdwSize = 0),会返回ERROR_INSUFFICIENT_BUFFER,*pdwSize里面有需要的Buffer大小。
ulAf:IP地址v4还是v6,AF_INET、AF_INET6
TableClass,对于AF_INET:
TableClass value | pTcpTable structure |
---|---|
TCP_TABLE_BASIC_ALL | MIB_TCPTABLE |
TCP_TABLE_BASIC_CONNECTIONS | MIB_TCPTABLE |
TCP_TABLE_BASIC_LISTENER | MIB_TCPTABLE |
TCP_TABLE_OWNER_MODULE_ALL | MIB_TCPTABLE_OWNER_MODULE |
TCP_TABLE_OWNER_MODULE_CONNECTIONS | MIB_TCPTABLE_OWNER_MODULE |
TCP_TABLE_OWNER_MODULE_LISTENER | MIB_TCPTABLE_OWNER_MODULE |
TCP_TABLE_OWNER_PID_ALL | MIB_TCPTABLE_OWNER_PID |
TCP_TABLE_OWNER_PID_CONNECTIONS | MIB_TCPTABLE_OWNER_PID |
TCP_TABLE_OWNER_PID_LISTENER | MIB_TCPTABLE_OWNER_PID |
对于AF_INET6:
TableClass value | pTcpTable structure |
---|---|
TCP_TABLE_BASIC_ALL | |
TCP_TABLE_BASIC_CONNECTIONS | |
TCP_TABLE_BASIC_LISTENER | |
TCP_TABLE_OWNER_MODULE_ALL | |
TCP_TABLE_OWNER_MODULE_CONNECTIONS | |
TCP_TABLE_OWNER_MODULE_LISTENER | |
TCP_TABLE_OWNER_PID_ALL | |
TCP_TABLE_OWNER_PID_CONNECTIONS | |
TCP_TABLE_OWNER_PID_LISTENER |
MIB_TCPTABLE_OWNER_PID
typedef struct {
DWORD dwNumEntries;
MIB_TCPROW_OWNER_PID table[ANY_SIZE];
} MIB_TCPTABLE_OWNER_PID, *PMIB_TCPTABLE_OWNER_PID;
MIB_TCPROW_OWNER_PID
typedef struct _MIB_TCPROW_OWNER_PID {
DWORD dwState;
DWORD dwLocalAddr;
DWORD dwLocalPort;
DWORD dwRemoteAddr;
DWORD dwRemotePort;
DWORD dwOwningPid;
} MIB_TCPROW_OWNER_PID, *PMIB_TCPROW_OWNER_PID;