Как я могу получить доступ к статистике Ethernet, подобной netstat, из программы Windows

Как я могу получить доступ к статистике 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

person Denes Tarjan    schedule 21.10.2008    source источник


Ответы (7)


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

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

  • СНМП. Требуется, чтобы SNMP был включен на компьютере, но, очевидно, может использоваться для получения статистики и для удаленных компьютеров.
  • Передайте вывод «netstat» в ваше приложение и извлеките значения из текста.
person Roddy    schedule 21.10.2008
comment
Вывод netstat зависит от локали и версии. Хороший вид с этим. :-Д - person Tomalak; 21.10.2008
comment
Хе-хе. Ну, это все же может быть проще, чем заставить SNMP работать правильно... ;-) - person Roddy; 21.10.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.

person Tomalak    schedule 21.10.2008
comment
Я просмотрел документацию, и мне не понятно, как использовать этот функционал. Знаете ли вы какие-нибудь хорошие примеры на C или C++ с использованием перечисленных вами классов? - person user3731622; 16.10.2015
comment
MSDN всегда является хорошей отправной точкой. Примеры приложений WMI C++. (Я думаю, вы могли бы найти это сами.) - person Tomalak; 16.10.2015
comment
Я видел это, но это было не очень ясно для меня. Я посмотрю еще раз. Спасибо. - person user3731622; 16.10.2015

Отвечу сам себе, так как спрашивал то же самое на другом форуме.

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");
        ...
person Denes Tarjan    schedule 21.10.2008
comment
Это то, что я предложил ранее. Затем вам нужно будет вызвать GetIpStatistics, чтобы получить нужную статистику. - person Roddy; 21.10.2008
comment
@Roddy нет, статистику из netstat -e нужно только вызвать GetIfTable, +1 для Denes - person ariwez; 01.08.2013

Сия,

из http://en.wikipedia.org/wiki/Netstat

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

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

person Ilya Kochetov    schedule 21.10.2008

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

person VolkerK    schedule 21.10.2008

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

person Community    schedule 21.10.2008

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

person Laisvis Lingvevicius    schedule 31.07.2013