如何从Windows程序访问类似netstat的以太网统计信息

如何从C / C ++代码如netstat -e访问以太网统计信息?

Interface Statistics Received Sent Bytes 21010071 15425579 Unicast packets 95512 94166 Non-unicast packets 12510 7 Discards 0 0 Errors 0 3 Unknown protocols 0 

启动网络统计的一个好地方是Windows IPHelper函数中的GetIpStatistics调用。

还有一些可能更便携的方法:

  • SNMP。 需要在计算机上启用SNMP,但显然也可以用于检索远程计算机的统计信息。
  • 将“netstat”的输出传送到您的应用程序中,并从文本中取消值。

WMI将提供这些读数:

 SELECT * FROM Win32_PerfFormattedData_Tcpip_IP SELECT * FROM Win32_PerfFormattedData_Tcpip_TCP SELECT * FROM Win32_PerfFormattedData_Tcpip_UDP SELECT * FROM Win32_PerfFormattedData_Tcpip_ICMP SELECT * FROM Win32_PerfFormattedData_Tcpip_Networkinterface 

这些类在Windows XP或更新版本上可用。 您可能不得不退出Windows 2000上匹配的“Win32_PerfRawData”类,然后再执行一些数学运算,然后才能显示输出。

在MSDN中查找所有这些文档 。

Szia,

来自http://en.wikipedia.org/wiki/Netstat

在Windows平台上,可以通过调用IP助手API或IPHLPAPI.DLL中的GetTcpTable和GetUdpTable函数来获取netstat信息。 返回的信息包括本地和远程IP地址,本地和远程端口以及(对于GetTcpTable)TCP状态代码。 除Windows附带的命令行netstat.exe工具外,还有基于GUI的可用的netstat程序。 在Windows平台上,只有在网络连接中的网络适配器的属性中安装Internet协议(TCP / IP)协议作为组件时,才能使用此命令。

在CodeProject的MFC示例: http : //www.codeproject.com/KB/applications/wnetstat.aspx

您可能会发现一个可行的WMI性能计数器 ,例如Win32_PerfRawData_Tcpip_NetworkInterface 。

让我自己回答,就像我在另一个论坛上所说的一样。

WMI是好的,但是使用IpHlpApi更容易:

 #include <winsock2.h> #include <iphlpapi.h> int main(int argc, char *argv[]) { PMIB_IFTABLE pIfTable; MIB_IFROW ifRow; PMIB_IFROW pIfRow = &ifRow; DWORD dwSize = 0; // first call returns the buffer size needed DWORD retv = GetIfTable(pIfTable, &dwSize, true); if (retv != ERROR_INSUFFICIENT_BUFFER) WriteErrorAndExit(retv); pIfTable = (MIB_IFTABLE*)malloc(dwSize); retv = GetIfTable(pIfTable, &dwSize, true); if (retv != NO_ERROR) WriteErrorAndExit(retv); // Get index int i,j; printf("\tNum Entries: %ld\n\n", pIfTable->dwNumEntries); for (i = 0; i < (int) pIfTable->dwNumEntries; i++) { pIfRow = (MIB_IFROW *) & pIfTable->table[i]; printf("\tIndex[%d]:\t %ld\n", i, pIfRow->dwIndex); printf("\tInterfaceName[%d]:\t %ws", i, pIfRow->wszName); printf("\n"); printf("\tDescription[%d]:\t ", i); for (j = 0; j < (int) pIfRow->dwDescrLen; j++) printf("%c", pIfRow->bDescr[j]); printf("\n"); ... 

看看Google Groups,原来的netstats源码已经贴了很多次了(win32 api)

如上面的答案所示,WMI性能计数器包含一些数据。 请注意,在更高版本的Windows中,perf计数器在v4 vs v6中被分解,所以查询是:

SELECT * FROM Win32_PerfFormattedData_Tcpip_IPv4

SELECT * FROM Win32_PerfFormattedData_Tcpip_TCPv4

SELECT * FROM Win32_PerfFormattedData_Tcpip_UDPv4

SELECT * FROM Win32_PerfFormattedData_Tcpip_ICMP

SELECT * FROM Win32_PerfFormattedData_Tcpip_IPv6

SELECT * FROM Win32_PerfFormattedData_Tcpip_TCPv6

SELECT * FROM Win32_PerfFormattedData_Tcpip_UDPv6

SELECT * FROM Win32_PerfFormattedData_Tcpip_ICMPv6