如何从Windows程序访问类似netstat的以太网统计信息
如何从C/C++代码访问以太网统计信息,如netstat -e?如何从Windows程序访问类似netstat的以太网统计信息
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”的输出传送到您的应用程序中,并取消文本中的值。
Szia,
从http://en.wikipedia.org/wiki/Netstat
在Windows平台上,netstat的 信息可以通过 调用GetTcpTable和IP帮助 API中 GetUdpTable功能,或IPHLPAPI检索.DLL。返回的信息 包括本地和远程IP地址,本地和远程端口以及 (用于GetTcpTable)TCP状态代码。在 除了命令行 netstat.exe工具附带的 Windows,还有基于GUI的netstat 程序可用。 在Windows平台上,该命令 仅在作为网络连接的 网络适配器的 属性中的组件安装的Internet协议(TCP/IP)协议为 时可用。在CodeProject
MFC示例:http://www.codeproject.com/KB/applications/wnetstat.aspx
的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中查找documentation on all of them。
见谷歌论坛,原netstats源代码已经发布很多次(Win32 API的)
让我回答我自己,因为我问另一个论坛上是相同的。
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");
...
如上的回答表明,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
我通过文件一看,这不是我清楚如何使用此功能。你知道在C或C++中使用你列出的类的好例子吗? – user3731622 2015-10-16 19:32:28
MSDN始终是一个很好的起点。 [WMI C++应用程序示例](https://msdn.microsoft.com/en-us/library/aa394558(v = vs.85).aspx)。 (我想你可能已经发现了你自己。) – Tomalak 2015-10-16 19:58:50
我确实看到了这一点,但对我而言并不是很清楚。我会再看一遍。谢谢。 – user3731622 2015-10-16 20:09:10