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?
Antwort
auf Linux:
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
sowohl die Kachel und der Körper der Frage erwähnen Linux und OSX. Hier geht es um den Linux-Teil – Javier
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.
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'). –
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;
}
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
Ich weiß, das ist für OSX. aber ich muss auf iOS-Geräten laufen. Eine Idee? – virata
Schön gemacht. Ich mag es, wenn Sie auch eine Objective-C-Lösung bereitstellen. – Armand
- 1. Wie bekomme ich OpenGL unter OSX
- 2. Wo/wie bekomme ich den Mac OSX "Login" -Befehl
- 3. Wie kompiliere ich RarCrack unter Mac OSX?
- 4. Wie bekomme ich das Hintergrundbild in Ziel c auf Mac OSX?
- 5. Ich versuche, Postgres auf OSX
- 6. Wie bekomme ich in Mailkit?
- 7. Wie installiere ich pycairo auf osx?
- 8. Wie kopiere ich zusätzliche Dateien nach OSX
- 9. App Installationsanfrage in osx
- 10. Wie bearbeite ich $ PATH (.bash_profile) auf OSX?
- 11. Wie installiere ich libksba auf Mac OSX?
- 12. Wie bekomme ich Python-Import mit dlib (mit cmake und osx)
- 13. Wie bekomme ich osx Shell-Skript um Farben im Echo zu zeigen
- 14. Java meldet Alias (Symlink) als Größe 0 unter Mac OSX. Wie bekomme ich die wahre Dateigröße?
- 15. Wie bekomme ich diese Taste auf NSWindow
- 16. Wie bekomme ich Instanznummer
- 17. Wie bekomme ich ApplicationController?
- 18. Warum bekomme ich eine langsamere Bildrate während des Capturing Screen in OSX?
- 19. Wie bekomme ich System.Web.Http.Owin?
- 20. Wie bekomme ich Hittyp?
- 21. Wie bekomme ich CCTray
- 22. Wie bekomme ich GetCustomAttributes?
- 23. Wie bekomme ich BigDecimalScale?
- 24. Wie bekomme ich Daten?
- 25. Wie bekomme ich sal.h
- 26. Wie bekomme ich xjc?
- 27. Wie bekomme ich meine Zähne in iPhone MIDI
- 28. Wie setze ich Text in Carbon Textfield auf OSX?
- 29. Wie deinstalliere ich Erlang mit Homebrew in OSX 10.10?
- 30. Wie kann ich CEF3 in meine OSX-Anwendung einbetten?
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