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

时间:2008-10-21 08:43:11

标签: c windows networking ethernet network-monitoring

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

7 个答案:

答案 0 :(得分: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中查找documentation on all of them

答案 1 :(得分:2)

启动网络统计信息的好地方是Windows IPHelper功能中的GetIpStatistics调用。

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

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

答案 2 :(得分: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");
        ...

答案 3 :(得分:1)

Szia,

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

  

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

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

答案 4 :(得分:1)

答案 5 :(得分:0)

查看Google网上论坛,原始netstats源代码已多次发布(win32 api)

答案 6 :(得分:0)

如上所述,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