2009-07-14 12 views
8

Sto cercando un modo per ottenere le statistiche di rete in C su Linux e MacOSX. Nello specifico, ho bisogno di monitorare il numero di byte caricati e scaricati da ogni scheda di rete sul sistema - Non ho bisogno di fare l'ispezione dei pacchetti, o di differenziare tra protocolli, solo un contatore 'total byte' che posso interrogare a intervalli Stammi bene. In Windows posso farlo usando la libreria iphlpapi.dll tramite GetIfTable (per elencare gli adattatori di rete) e GetIfEntry (per leggere le statistiche), ma non riesco a trovare gli equivalenti di Linux/OSX. La mia conoscenza di C è abbastanza semplice quindi apprezzerei una soluzione che non fosse troppo coinvolta. Qualsiasi aiuto sarebbe molto apprezzato!Come ottenere le statistiche dell'adattatore di rete in linux/Mac OSX?

+0

Da quello che ho trovato finora, non si ha intenzione di essere in grado di utilizzare codice comune su entrambe le piattaforme. Sembra che Linux utilizzi il file system per conservare queste informazioni e il normale metodo di interrogazione dei sistemi è quello di leggere i file. Su OSX le informazioni sono conservate in memoria e file oscuri. – Armand

risposta

2

su Linux:

  • basso livello: verificare /sys/class/net/eth0/statistics/
  • livello leggermente superiore: ip -s link show eth0
  • grafica: iftop
  • interattivo: iptraf
+4

Il titolo della domanda è OSX. I primi due non funzionano su OSX. I due in basso non sono adatti alla domanda, essendo grafici e interattivi. – Purrell

+2

sia la tessera che il corpo della domanda menzionano Linux e OSX. si tratta della parte Linux – Javier

1

non posso parlare a OSX ma su Linux date un'occhiata a/proc/net/dev.

Se si esegue "cat/proc/net/dev", è necessario visualizzare le statistiche che includono "byte": il numero totale di byte di dati trasmessi o ricevuti dall'interfaccia. Puoi leggere il file all'interno del tuo programma.

EDIT:

non ho letto tutta la tua domanda. This article dovrebbe aiutarti a iniziare con/proc e ha una sezione su/proc/net/dev.

Inoltre, per elencare le interfacce è possibile chiamare ioctl con l'opzione SIOCGIFCONF. Puoi Google per un esempio di codice decente su come eseguire il loop dei dati restituiti. Oppure puoi semplicemente estrarlo dai dati di /proc.net/dev di cui sopra, che dovrebbe essere più semplice.

+0

Oppure, come da risposta di Javier, guarda i file sotto '/ sys/class/net/{interfaccia di rete}/statistics', dove' {your network interface} 'è il nome della rete interfaccia che vuoi guardare, ad es 'eth0' per la prima interfaccia Ethernet. sysfs (su '/ sys') è più recente di procfs (su'/proc'). –

20

Il codice sorgente di Darwin netstat utilizza sysctl. Ecco po 'di codice che stampa il numero di byte in entrata e in uscita su 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; 
} 
+0

Funziona perfettamente con il simulatore. ma dà errore sul dispositivo. error is-/Users/praveendala/Desktop/all in one3/app2/app2/main.m: 13: 10: errore fatale: file 'net/route.h' non trovato. – virata

+0

So che questo è per OSX. ma ho bisogno di eseguire su dispositivi ios.una tua idea? – virata

+0

Ben fatto. Mi piace che tu fornisca anche una soluzione Objective-C. – Armand

Problemi correlati