如何从 Windows 程序访问类似 netstat 的以太网统计信息
-
03-07-2019 - |
题
如何从 C/C++ 代码访问以太网统计信息,例如 网络状态-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
解决方案
网络统计的一个不错的起点是 获取IP统计信息 调用 Windows IPHelper 函数。
还有其他几种可能更便携的方法:-
- 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或更高版本上使用。您可能必须辞职到匹配的“Win32_PerfRawData”。 Windows 2000上的类,在显示输出之前先做一些数学运算。
查找所有这些文件 MSDN。
让我回答自己,正如我在另一个论坛上提出的那样。
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");
...
西娅,
从 http://en.wikipedia.org/wiki/Netstat
在Windows平台上,可以通过在IP Helper API或iphlpapi.dll中调用可gettcptptable和getudptable功能来检索NetStat信息。返回的信息包括本地和远程IP地址,本地和远程端口,以及(对于可获取的)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 。
查看Google网上论坛,原始netstats源代码已多次发布(win32 api)
如上所述,WMI性能计数器包含一些数据。请注意,在Windows的更高版本中,性能计数器在v4与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