5

如何从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
4

7 回答 7

6

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 中找到所有这些的文档。

于 2008-10-21T09:04:52.560 回答
2

Windows IPHelper 函数中的GetIpStatistics调用是开始进行网络统计的好地方。

还有其他几种可能更便携的方法:-

  • SNMP。需要在计算机上启用 SNMP,但显然也可以用于检索远程计算机的统计信息。
  • 将“netstat”的输出通过管道传输到您的应用程序中,然后从文本中取消选择值。
于 2008-10-21T09:06:51.883 回答
2

让我回答自己,因为我在另一个论坛上问过同样的问题。

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");
        ...
于 2008-10-21T16:28:27.063 回答
1

齐亚,

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

在 Windows 平台上,可以通过调用 IP Helper 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

于 2008-10-21T08:58:51.883 回答
1

您可能会找到一个可行的WMI 性能计数器,例如Win32_PerfRawData_Tcpip_NetworkInterface

于 2008-10-21T09:06:17.703 回答
0

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

于 2008-10-21T16:03:19.640 回答
0

正如上面的答案所暗示的,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

于 2013-07-31T17:06:20.230 回答