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

StackOverflow https://stackoverflow.com/questions/221181

Вопрос

Как я могу получить доступ к статистике Ethernet из кода 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
Это было полезно?

Решение

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

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

  • СНМП.Требуется, чтобы на компьютере был включен SNMP, но, очевидно, его можно использовать и для получения статистики для удаленных компьютеров.
  • Направьте вывод netstat в свое приложение и извлеките значения из текста.

Другие советы

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.

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

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");
        ...

Сия,

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

На платформе Windows информация NetStat может быть получена, вызывая функции GetTcptable и Getudptable в API IP Helper или iphlpapi.dll.Возвращенная информация включает в себя локальные и удаленные IP -адреса, локальные и удаленные порты и (для GetTcptable) коды состояния TCP.В дополнение к инструменту командной строки netstat.exe, который поставляется с Windows, доступны программы NetStat на основе GUI.На платформе Windows эта команда доступна только в том случае, если протокол интернет -протокола (TCP/IP) установлен в качестве компонента в свойствах сетевого адаптера в сетевых подключениях.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top