Question

Comment accéder aux statistiques Ethernet à partir du code C / C ++, tel que 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
Était-ce utile?

La solution

Un bon point de départ pour les statistiques réseau est le GetIpStatistics dans les fonctions Windows IPHelper.

Il existe quelques autres approches qui sont peut-être plus portables: -

  • SNMP. Nécessite l'activation de SNMP sur l'ordinateur, mais peut évidemment aussi être utilisé pour récupérer des statistiques pour les ordinateurs distants.
  • Transférez le résultat de "netstat" dans votre application, puis désélectionnez les valeurs dans le texte.

Autres conseils

Le WMI fournira ces lectures:

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

Ces classes sont disponibles sous Windows XP ou plus récent. Vous devrez peut-être renoncer à l'option " Win32_PerfRawData " correspondante. classes sur Windows 2000, et faire un peu plus de maths avant de pouvoir afficher la sortie.

Trouvez la documentation sur chacun d'entre eux dans le MSDN.

Laissez-moi répondre moi-même, comme je l'avais déjà demandé sur un autre forum.

WMI est bon, mais il est plus facile d'utiliser IpHlpApi à la place:

#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,

de http://en.wikipedia.org/wiki/Netstat

  

Sur la plate-forme Windows, netstat   les informations peuvent être récupérées par   appeler le GetTcpTable et   Fonctions GetUdpTable dans l'IP Helper   API ou IPHLPAPI.DLL. Information   renvoyé inclut les adresses IP locale et distante   adresses, ports locaux et distants, et   (pour GetTcpTable) Codes d'état TCP. Dans   ajout à la ligne de commande   outil netstat.exe fourni avec   Windows, il existe des netstat basés sur une interface graphique   programmes disponibles.   Sur la plate-forme Windows, cette commande   est disponible uniquement si Internet   Protocole (TCP / IP) est   installé en tant que composant dans le   propriétés d'une carte réseau dans   Connexions réseau.

Exemple MFC dans CodeProject: http://www.codeproject.com/KB/ applications / wnetstat.aspx

Voir Groupes Google, le code source netstats d'origine a été publié plusieurs fois (win32 api)

Comme suggéré ci-dessus, les compteurs de performance WMI contiennent des données. Sachez simplement que dans les versions ultérieures de Windows, les compteurs de performances sont ventilés dans v4 vs v6, de sorte que les requêtes sont les suivantes:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top