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
È stato utile?

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

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top