Как получить доступ к статистике 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
7 ответов
Хорошее место для начала сетевой статистики - вызов GetIpStatistics в функциях Windows IPHelper.
Есть несколько других подходов, которые, возможно, более переносимы:
- SNMP. Требует, чтобы 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");
...
Вы можете найти подходящий счетчик производительности WMI, например, Win32_PerfRawData_Tcpip_NetworkInterface.
Szia,
с http://en.wikipedia.org/wiki/Netstat
На платформе Windows информацию netstat можно получить, вызвав функции GetTcpTable и GetUdpTable в IP Helper API или IPHLPAPI.DLL. Возвращаемая информация включает в себя локальные и удаленные IP-адреса, локальные и удаленные порты и (для GetTcpTable) коды состояния TCP. В дополнение к инструменту командной строки netstat.exe, который поставляется с Windows, доступны программы netstat на основе графического интерфейса. На платформе Windows эта команда доступна только в том случае, если протокол Internet Protocol (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