Pregunta

¿Cómo puedo acceder a las estadísticas de Ethernet desde el código C / C ++ como 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
¿Fue útil?

Solución

Un buen lugar para comenzar con las estadísticas de la red sería GetIpStatistics llama en las funciones de Windows IPHelper.

Hay un par de otros enfoques que posiblemente sean más portátiles: -

  • SNMP. Requiere que SNMP esté habilitado en la computadora, pero obviamente puede usarse para recuperar estadísticas para computadoras remotas también.
  • Coloque la salida de 'netstat' en su aplicación y elimine los valores del texto.

Otros consejos

El WMI proporcionará esas lecturas:

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

Estas clases están disponibles en Windows XP o posterior. Es posible que deba renunciar a la coincidencia " Win32_PerfRawData " clases en Windows 2000, y haz un poco más de matemáticas antes de que puedas mostrar el resultado.

Encuentre documentación sobre todos ellos en el MSDN.

Permítanme responderme a mí mismo, ya que pregunté lo mismo en otro foro.

WMI es bueno, pero es más fácil usar IpHlpApi en su lugar:

#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

  

En la plataforma de Windows, netstat   la información puede ser recuperada por   llamando a la GetTcpTable y   Funciones GetUdpTable en el IP Helper   API, o IPHLPAPI.DLL. Información   devuelto incluye IP local y remota   direcciones, puertos locales y remotos, y   (para GetTcpTable) códigos de estado TCP. En   Además de la línea de comando   La herramienta netstat.exe que viene con   Windows, hay netstat basado en GUI   Programas disponibles.   En la plataforma Windows, este comando   Solo está disponible si Internet   Protocolo (TCP / IP) es el protocolo   instalado como un componente en el   propiedades de un adaptador de red en   Conexiones de red.

Ejemplo de MFC en CodeProject: http://www.codeproject.com/KB/ aplicaciones / wnetstat.aspx

Ver Grupos de Google, el código fuente original de netstats ha sido publicado muchas veces (win32 api)

Como sugieren las respuestas anteriores, los contadores de rendimiento de WMI contienen algunos datos. Solo tenga en cuenta que en versiones posteriores de Windows los contadores de rendimiento se desglosan en v4 vs v6, por lo que las consultas son:

SELECCIONAR * DESDE Win32_PerfFormattedData_Tcpip_IPv4

SELECCIONAR * DESDE Win32_PerfFormattedData_Tcpip_TCPv4

SELECCIONAR * DE Win32_PerfFormattedData_Tcpip_UDPv4

SELECCIONAR * DE Win32_PerfFormattedData_Tcpip_ICMP

SELECCIONAR * DE Win32_PerfFormattedData_Tcpip_IPv6

SELECCIONAR * DESDE Win32_PerfFormattedData_Tcpip_TCPv6

SELECCIONAR * DESDE Win32_PerfFormattedData_Tcpip_UDPv6

SELECCIONAR * DESDE Win32_PerfFormattedData_Tcpip_ICMPv6

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top