Как получить доступ к статистике Ethernet, похожей на netstat, из программы Windows - PullRequest
5 голосов
/ 21 октября 2008

Как получить доступ к статистике Ethernet из кода C / C ++, например netstat -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

Ответы [ 7 ]

6 голосов
/ 21 октября 2008

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.

2 голосов
/ 21 октября 2008

Позвольте мне ответить самому себе, как я спрашивал об этом на другом форуме.

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");
        ...
2 голосов
/ 21 октября 2008

Хорошим местом для начала сетевой статистики будет вызов GetIpStatistics в функциях Windows IPHelper.

Есть несколько других подходов, которые, возможно, более переносимы: -

  • SNMP. Требует, чтобы SNMP был включен на компьютере, но, очевидно, может использоваться для получения статистики для удаленных компьютеров.
  • Передайте вывод netstat в ваше приложение и уберите значения из текста.
1 голос
/ 21 октября 2008

Вы можете найти выполнимый Счетчик производительности WMI , например Win32_PerfRawData_Tcpip_NetworkInterface .

1 голос
/ 21 октября 2008

Szia,

от http://en.wikipedia.org/wiki/Netstat

На платформе Windows, netstat информация может быть получена вызывая GetTcpTable и Функции GetUdpTable в помощнике по IP API или IPHLPAPI.DLL. Информация возвращается включает в себя локальный и удаленный IP адреса, локальные и удаленные порты, и (для GetTcpTable) Коды состояния TCP. В дополнение к командной строке netstat.exe инструмент, который поставляется с Windows, есть GUI на основе netstat программы доступны. На платформе Windows эта команда доступно только если интернет Протокол (TCP / IP) протокол устанавливается как компонент в свойства сетевого адаптера в Сетевые подключения.

Образец MFC в CodeProject: http://www.codeproject.com/KB/applications/wnetstat.aspx

0 голосов
/ 31 июля 2013

Как показывают ответы выше, счетчики производительности 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

0 голосов
/ 21 октября 2008

См. Google Groups, оригинальный исходный код netstats был опубликован много раз (win32 api)

...