代码之家  ›  专栏  ›  技术社区  ›  Dénes Tarján

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

  •  4
  • Dénes Tarján  · 技术社区  · 17 年前

    ?

    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 回复  |  直到 17 年前
        1
  •  6
  •   Tomalak    17 年前

    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”类,并在显示输出之前多做一点数学运算。

    documentation on all of them

        2
  •  2
  •   Roddy    17 年前

    网络统计的一个好起点是 GetIpStatistics

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

    • SNMP。需要在计算机上启用SNMP,但显然也可以用于检索远程计算机的统计信息。
    • 将“netstat”的输出导入应用程序,然后从文本中取消选择值。
        3
  •  2
  •   Dénes Tarján    17 年前

    让我回答我自己,正如我在另一个论坛上所问的那样。

    WMI很好,但使用IPHLAPI更容易:

    #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");
            ...
    
        4
  •  1
  •   Ilya Kochetov    17 年前

    从…起 http://en.wikipedia.org/wiki/Netstat

    在Windows平台上,netstat 可通过以下方式检索信息: IP帮助程序中的GetUdpTable函数 API或iphlapi.DLL。信息 返回的包括本地和远程IP 地址、本地和远程端口,以及 (对于GetTcpTable)TCP状态代码。在里面 添加到命令行 在Windows中,有基于GUI的netstat 提供的程序。 只有在使用Internet时才可用 协议(TCP/IP)协议是 作为组件安装在 网络连接。

    http://www.codeproject.com/KB/applications/wnetstat.aspx

        5
  •  1
  •   VolkerK    17 年前

    你可能会发现一个可行的方法 WMI performance counter ,例如。 Win32_PerfRawData_Tcpip_NetworkInterface .

        6
  •  0
  •   marc marc    17 年前

    请参阅Google Groups,原始netstats源代码已发布多次(win32 api)

        7
  •  0
  •   Laisvis Lingvevicius    13 年前

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

    从Win32\u performatteddata\u Tcpip\u UDPv4中选择*

    从Win32\u PerfFormattedData\u Tcpip\u ICMP中选择*

    从Win32\u performatteddata\u Tcpip\u TCPv6中选择*

    从Win32\u PerfFormattedData\u Tcpip\u ICMPv6中选择*