2009-07-14 8 views
8

Szukam sposobu na uzyskanie statystyki sieci w C na Linux i MacOSX. W szczególności potrzebuję monitorować liczbę bajtów przesłanych i pobranych z każdej karty sieciowej w systemie - nie muszę wykonywać inspekcji pakietów ani rozróżniać protokołów, tylko "licznik całkowitej bajtów", który mogę sondować w odstępach czasu. w porządku. W systemie Windows mogę to zrobić za pomocą biblioteki iphlpapi.dll poprzez GetIfTable (aby wyświetlić listę kart sieciowych) i GetIfEntry (aby odczytać statystyki), ale nie mogę znaleźć odpowiedników Linux/OSX. Moja znajomość języka C jest dość podstawowa, dlatego doceniłbym rozwiązanie, które nie jest zbytnio zaangażowane. Każda pomoc będzie doceniona!Jak uzyskać statystyki karty sieciowej w systemie Linux/Mac OSX?

+0

Z tego co znalazłem do tej pory, nie będą w stanie wykorzystać wspólny kod na obu platformach. Wygląda na to, że Linux używa systemu plików do przechowywania tych informacji, a normalną metodą sprawdzania systemów jest odczytywanie plików. W systemie OSX informacje są przechowywane w pamięci i ukrytych plikach. – Armand

Odpowiedz

2

w systemie Linux:

  • niski poziom: sprawdź /sys/class/net/eth0/statistics/
  • nieznacznie wyższy poziom: ip -s link show eth0
  • graficzny: iftop
  • interaktywny: iptraf
+4

Tytuł pytania to OSX. Pierwsze dwa nie działają na OSX. Dwa dolne nie nadają się również do kwestionowania, ponieważ są graficzne i interaktywne. – Purrell

+2

zarówno kafelek, jak i treść pytania wymieniają Linux i OSX. chodzi o Linuksową część – Javier

1

nie mogę rozmawiać OSX, ale na Linuksie spójrz na/proc/net/dev.

Jeśli wykonujesz polecenie "cat/proc/net/dev", powinieneś zobaczyć statystyki, w tym "bajtów" - całkowitą liczbę bajtów danych przesłanych lub odebranych przez interfejs. Możesz przeczytać plik w swoim własnym programie.

EDIT:

nie przeczytałem całe swoje pytanie. This article powinien pomóc Ci zacząć pracę z proc/i ma sekcję o/proc/net/dev.

Aby wyświetlić listę interfejsów, można zadzwonić pod numer ioctl za pomocą opcji SIOCGIFCONF. Możesz Google za przyzwoity przykład kodu, jak przechwytywać zwrócone dane. Możesz też po prostu wyciągnąć go z wyżej wymienionych /proc.net/dev, co powinno być łatwiejsze.

+0

Lub, zgodnie z odpowiedzią Javiera, spójrz na pliki w '/ sys/class/net/{twoim interfejsie sieciowym}/statistics', gdzie' {twój interfejs sieciowy} 'to nazwa sieci interfejs, na który chcesz spojrzeć, np 'eth0' dla pierwszego interfejsu Ethernet. sysfs (na '/ sys') jest nowszy niż procfs (na'/proc'). –

20

Kod źródłowy netwina Darwina używa sysctl. Oto niektóre kod, który wyświetla liczbę bajtów i pomniejszanie 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

To działa dobrze na symulatorze. ale daje błąd na urządzeniu. error is-/Users/praveendala/Desktop/all in one3/app2/app2/main.m: 13: 10: błąd krytyczny: nie znaleziono pliku "net/route.h". – virata

+0

Wiem, że to jest dla OSX. ale muszę uruchomić na ios devices.any pomysł? – virata

+0

Ładnie wykonane. Podoba mi się, że dostarczyłeś również rozwiązanie Objective-C. – Armand