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

Posted

技术标签:

【中文标题】如何从 Windows 程序访问类似 netstat 的以太网统计信息【英文标题】:How can I access netstat-like Ethernet statistics from a Windows program 【发布时间】:2010-09-18 06:47:11 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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。

【讨论】:

我查看了文档,但不清楚如何使用此功能。您知道使用您列出的类的 C 或 C++ 中的任何好的示例吗? MSDN 总是一个很好的起点。 WMI C++ Application Examples。 (我想你自己也可以找到的。) 我确实看到了,但对我来说不是很清楚。我会再看一遍。谢谢。【参考方案2】:

Windows IPHelper 函数中的GetIpStatistics 调用是网络统计的一个好起点。

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

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

【讨论】:

netstat 的输出是特定于语言环境和版本的。很好看。 :-D 呵呵。好吧,它可能仍然比让 SNMP 正常工作更容易...... ;-)【参考方案3】:

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

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");
        ...

【讨论】:

这就是我之前的建议。然后,您需要调用 GetIpStatistics 以获取所需的统计信息。 @Roddy 不,“netstat -e”的统计数据只需要调用 GetIfTable,为 Denes +1【参考方案4】:

齐亚,

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

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

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

【讨论】:

【参考方案5】:

您可能会找到一个可行的WMI performance counter,例如Win32_PerfRawData_Tcpip_NetworkInterface.

【讨论】:

【参考方案6】:

见Google Groups,原创netstats源码已经贴过很多次了(win32 api)

【讨论】:

【参考方案7】:

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

从 Win32_PerfFormattedData_Tcpip_IPv4 中选择 *

从 Win32_PerfFormattedData_Tcpip_TCPv4 中选择 *

从 Win32_PerfFormattedData_Tcpip_UDPv4 中选择 *

从 Win32_PerfFormattedData_Tcpip_ICMP 中选择 *

从 Win32_PerfFormattedData_Tcpip_IPv6 中选择 *

从 Win32_PerfFormattedData_Tcpip_TCPv6 中选择 *

从 Win32_PerfFormattedData_Tcpip_UDPv6 中选择 *

从 Win32_PerfFormattedData_Tcpip_ICMPv6 中选择 *

【讨论】:

以上是关于如何从 Windows 程序访问类似 netstat 的以太网统计信息的主要内容,如果未能解决你的问题,请参考以下文章

Windows查看所有的端口及端口对应的程序

如何从 WPF 访问 Windows.Devices.Scanners

如何从我的 Windows Phone 8 应用程序(XAML 和 C#)访问相机并将拍摄的照片保存在确定的文件夹中?

从WebBrowser访问DOM

python跨平台的进程管理psutil

如何从应用程序目录中访问文件