Come posso accedere a statistiche Ethernet simili a netstat da un programma Windows
-
03-07-2019 - |
Domanda
Come posso accedere alle statistiche Ethernet dal codice C / C ++ come 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
Soluzione
Un buon punto di partenza per le statistiche di rete sarebbe GetIpStatistics chiama nelle funzioni IPHelper di Windows.
Ci sono un paio di altri approcci che sono forse più portabili: -
- SNMP. Richiede che SNMP sia abilitato sul computer, ma può ovviamente essere usato per recuperare statistiche anche per computer remoti.
- Installa l'output di 'netstat' nella tua applicazione e deseleziona i valori dal testo.
Altri suggerimenti
Il WMI fornirà queste letture:
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
Queste classi sono disponibili su Windows XP o versioni successive. Potrebbe essere necessario dimettersi alla corrispondenza " Win32_PerfRawData " classi su Windows 2000 e fai un po 'più di matematica prima di poter visualizzare l'output.
Trova su tutti in il MSDN.
Lasciami rispondere a me stesso, come ho chiesto lo stesso su un altro forum.
WMI è buono, ma è più facile usare IpHlpApi invece:
#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");
...
Szia,
da http://en.wikipedia.org/wiki/Netstat
Sulla piattaforma Windows, netstat le informazioni possono essere recuperate da chiamando la tabella GetTcp e Funzioni GetUdpTable nell'helper IP API o IPHLPAPI.DLL. Informazione restituito include IP locale e remoto indirizzi, porte locali e remote e (per GetTcpTable) Codici di stato TCP. Nel oltre alla riga di comando Strumento netstat.exe fornito con Windows, ci sono netstat basati su GUI programmi disponibili. Sulla piattaforma Windows, questo comando è disponibile solo se Internet Protocollo (TCP / IP) è il protocollo installato come componente in proprietà di una scheda di rete in Connessioni di rete.
Esempio MFC su CodeProject: http://www.codeproject.com/KB/ applicazioni / wnetstat.aspx
È possibile trovare un contatore delle prestazioni WMI , ad es Win32_PerfRawData_Tcpip_NetworkInterface .
Vedi Google Gruppi, il codice sorgente originale di netstats è stato pubblicato molte volte (win32 api)
Come suggerito dalle risposte precedenti, i contatori delle prestazioni WMI contengono alcuni dati. Basta essere consapevoli del fatto che nelle versioni successive di Windows i contatori perf sono suddivisi in v4 vs v6, quindi le query sono:
SELEZIONA * DA Win32_PerfFormattedData_Tcpip_IPv4
SELEZIONA * DA Win32_PerfFormattedData_Tcpip_TCPv4
SELEZIONA * DA Win32_PerfFormattedData_Tcpip_UDPv4
SELEZIONA * DA Win32_PerfFormattedData_Tcpip_ICMP
SELEZIONA * DA Win32_PerfFormattedData_Tcpip_IPv6
SELEZIONA * DA Win32_PerfFormattedData_Tcpip_TCPv6
SELEZIONA * DA Win32_PerfFormattedData_Tcpip_UDPv6
SELEZIONA * DA Win32_PerfFormattedData_Tcpip_ICMPv6