2009-07-14 6 views
8

Ich suche nach einer Möglichkeit, Netzwerk-Statistiken in C auf Linux und MacOSX zu bekommen. Insbesondere muss ich die Anzahl der von jedem Netzwerkadapter auf dem System hochgeladenen und heruntergeladenen Bytes überwachen - ich muss keine Paketprüfung durchführen oder zwischen Protokollen unterscheiden, nur einen "Gesamt-Bytes" -Zähler, den ich in Intervallen abfragen kann gut. In Windows kann ich dies mit der iphlpapi.dll-Bibliothek über GetIfTable (um die Netzwerkadapter aufzulisten) und GetIfEntry (um die Stats zu lesen), aber ich kann die Linux/OSX-Äquivalente nicht finden. Mein Wissen über C ist ziemlich einfach, daher würde ich mich über eine Lösung freuen, die nicht zu kompliziert ist. Jede Hilfe würde sehr geschätzt werden!Wie bekomme ich Netzwerkadapter-Statistiken in Linux/Mac OSX?

+0

Von dem, was ich bisher gefunden haben, werden Sie in der Lage sein nicht gemeinsamen Code auf beiden Plattformen zu verwenden. Es scheint, dass Linux das Dateisystem verwendet, um diese Informationen beizubehalten, und die normale Methode der Abfrage der Systeme besteht darin, die Dateien zu lesen. Unter OSX werden die Informationen im Speicher gehalten und die Dateien werden verschleiert. – Armand

Antwort

2

auf Linux:

  • niedriges Niveau: Check /sys/class/net/eth0/statistics/
  • etwas höher: ip -s link show eth0
  • grafische: iftop
  • interaktiv: iptraf
+4

Titel der Frage ist OSX. Die ersten beiden funktionieren nicht unter OSX. Die unteren beiden sind auch nicht geeignet, um Fragen zu stellen, da sie grafisch und interaktiv sind. – Purrell

+2

sowohl die Kachel und der Körper der Frage erwähnen Linux und OSX. Hier geht es um den Linux-Teil – Javier

1

ich nicht sprechen kann OSX aber unter Linux schauen Sie sich/proc/net/dev an.

Wenn Sie "cat/proc/net/dev" verwenden, sollten Sie Statistiken einschließlich "Bytes" sehen - die Gesamtzahl der Bytes von Daten, die von der Schnittstelle gesendet oder empfangen werden. Sie können die Datei in Ihrem eigenen Programm lesen.

EDIT:

Ich habe nicht Ihre ganze Frage lesen. This article sollte Ihnen helfen, mit/proc zu beginnen und hat einen Abschnitt über/proc/net/dev.

Um die Schnittstellen aufzulisten, können Sie auch ioctl mit der Option SIOCGIFCONF aufrufen. Sie können Google für ein anständiges Codebeispiel zum Durchlaufen der zurückgegebenen Daten verwenden. Oder Sie können es einfach aus den oben genannten /proc.net/dev -Daten ziehen, was einfacher sein sollte.

+0

Oder, nach Javiers Antwort, schauen Sie sich die Dateien unter '/ sys/class/net/{Ihre Netzwerkschnittstelle}/statistics' an, wobei' {your network interface} 'der Name des Netzwerks ist Schnittstelle, die Sie betrachten möchten, z 'eth0' für die erste Ethernet-Schnittstelle. sysfs (in '/ sys') ist neuer als procfs (in'/proc'). –

20

Der Darwin-Netstat-Quellcode verwendet sysctl. Hier einige Code, der die Anzahl von Bytes in und aus auf OSX druckt:

#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

Dies funktioniert am Simulator. aber gibt Fehler auf dem Gerät. Fehler is-/Benutzer/praveendala/Desktop/alle in one3/app2/app2/main.m: 13: 10: Schwerwiegender Fehler: Datei 'net/route.h' nicht gefunden. – virata

+0

Ich weiß, das ist für OSX. aber ich muss auf iOS-Geräten laufen. Eine Idee? – virata

+0

Schön gemacht. Ich mag es, wenn Sie auch eine Objective-C-Lösung bereitstellen. – Armand