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?
risposta
su Linux:
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.
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'). –
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;
}
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
So che questo è per OSX. ma ho bisogno di eseguire su dispositivi ios.una tua idea? – virata
Ben fatto. Mi piace che tu fornisca anche una soluzione Objective-C. – Armand
- 1. Come posso ottenere le statistiche di throughput corrente dell'interfaccia di rete su Linux/UNIX?
- 2. Ottenere statistiche grafite accurate_counts
- 3. Monitoraggio delle statistiche di rete di un'applicazione (netstats) usando ADB
- 4. Come ottenere le statistiche delle mie app su itunes?
- 5. Come tirare le statistiche di Google Analytics?
- 6. Come ottenere OpenGL in esecuzione su OSX
- 7. leggenda per le statistiche riassuntive in ggplot2
- 8. Rete neurale involutiva - Come ottenere le mappe delle funzioni?
- 9. Come ottenere la stat del traffico di rete per le applicazioni di streaming video su Android?
- 10. Impossibile ottenere le credenziali di rete per funzionare
- 11. Le statistiche di ibernazione in avvio di primavera non funzionano?
- 12. Come ottenere statistiche tramite API su un'email inviata con Mandrill?
- 13. Come raccogliere le statistiche all'interno della callback di ragno graffiante?
- 14. AVPlayer: come gestire le interruzioni di rete
- 15. Ottenere statistiche della memoria in Java: Runtime vs. MemoryMXBean
- 16. Come ottenere statistiche sull'utilizzo della CPU su Android?
- 17. Le statistiche sulle Tempo Query (PostgreSQL)
- 18. Boxplot Matplotlib utilizzando le statistiche precalcolate (sommario)
- 19. Come ottenere lo stato della rete del sistema in Qt?
- 20. Come evitare le bancarelle di rete in GetFileAttributes?
- 21. Come rispettare le impostazioni di utilizzo della rete in Android
- 22. Ottenere rete MNC e MCC
- 23. Faking di statistiche Oracle?
- 24. Come calcolare le statistiche "t-test" con numpy
- 25. Lcov: impossibile raccogliere le statistiche di copertura delle filiali
- 26. Come implementare efficienti statistiche di runtime C++
- 27. Come raccogliere le statistiche delle prestazioni JVM da java
- 28. Come far sì che Sonar esporti le statistiche dei test?
- 29. Ottieni statistiche sul traffico wifi android
- 30. API statistiche di mercato Android?
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