Как я могу получить доступ к статистике Ethernet, подобной netstat, из программы Windows
-
03-07-2019 - |
Вопрос
Как я могу получить доступ к статистике 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
Вы можете найти выполнимый счетчик производительности WMI например Win32_PerfRawData_Tcpip_NetworkInterface .
См. 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