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?
Odpowiedz
w systemie Linux:
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.
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'). –
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;
}
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
Wiem, że to jest dla OSX. ale muszę uruchomić na ios devices.any pomysł? – virata
Ładnie wykonane. Podoba mi się, że dostarczyłeś również rozwiązanie Objective-C. – Armand
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