c - por - saber el hostname de una ip linux
¿Cómo obtener las estadísticas del adaptador de red en Linux/Mac OSX? (3)
No puedo hablar con OSX, pero en Linux, eche un vistazo a / proc / net / dev.
Si hace ''cat / proc / net / dev'', debería ver estadísticas que incluyen ''bytes'', la cantidad total de bytes de datos transmitidos o recibidos por la interfaz. Puedes leer el archivo dentro de tu propio programa.
EDITAR:
No leí toda tu pregunta. Este artículo debería ayudarlo a comenzar con / proc y tiene una sección en / proc / net / dev.
Además, para enumerar las interfaces, puede llamar a ioctl con la opción SIOCGIFCONF . Puede buscar un ejemplo de código decente sobre cómo recorrer los datos devueltos. O simplemente puede sacarlo de los datos de /proc.net/dev mencionados anteriormente, lo que debería ser más fácil.
Estoy buscando una forma de obtener estadísticas de red en C en Linux y MacOSX. Específicamente, necesito monitorear el número de bytes cargados y descargados desde cada adaptador de red en el sistema - No necesito hacer inspección de paquetes, o diferenciar entre protocolos, solo un contador de ''bytes totales'' que puedo sondear a intervalos estar bien. En Windows, puedo hacer esto usando la biblioteca iphlpapi.dll a través de GetIfTable (para listar los adaptadores de red) y GetIfEntry (para leer las estadísticas), pero no puedo encontrar los equivalentes de Linux / OSX. Mi conocimiento de C es bastante básico, por lo que agradecería una solución que no esté demasiado involucrada. ¡Cualquier ayuda sería muy apreciada!
El código fuente de netstat de Darwin usa sysctl. Aquí hay un código que imprime el número de bytes dentro y fuera de OSX:
#import <Foundation/Foundation.h>
#include <sys/sysctl.h>
#include <netinet/in.h>
#include <net/if.h>
#include <net/route.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int mib[] = {
CTL_NET,
PF_ROUTE,
0,
0,
NET_RT_IFLIST2,
0
};
size_t len;
if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
fprintf(stderr, "sysctl: %s/n", strerror(errno));
exit(1);
}
char *buf = (char *)malloc(len);
if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
fprintf(stderr, "sysctl: %s/n", strerror(errno));
exit(1);
}
char *lim = buf + len;
char *next = NULL;
u_int64_t totalibytes = 0;
u_int64_t totalobytes = 0;
for (next = buf; next < lim; ) {
struct if_msghdr *ifm = (struct if_msghdr *)next;
next += ifm->ifm_msglen;
if (ifm->ifm_type == RTM_IFINFO2) {
struct if_msghdr2 *if2m = (struct if_msghdr2 *)ifm;
totalibytes += if2m->ifm_data.ifi_ibytes;
totalobytes += if2m->ifm_data.ifi_obytes;
}
}
printf("total ibytes %qu/tobytes %qu/n", totalibytes, totalobytes);
[pool drain];
return 0;
}