¿Cómo puedo acceder a las estadísticas de Ethernet tipo netstat desde un programa de Windows?
-
03-07-2019 - |
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
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
Puede encontrar un contador de rendimiento de WMI , p. ej. Win32_PerfRawData_Tcpip_NetworkInterface .
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