Je cherche un moyen de saisir des statistiques réseau en C sur Linux et MacOSX. Spécifiquement, j'ai besoin de surveiller le nombre d'octets téléchargés et téléchargés à partir de chaque adaptateur réseau sur le système - je n'ai pas besoin de faire une inspection de paquets ou de différencier les protocoles, juste un compteur de «octets total» que je peux sonder à des intervalles. être bien. Dans Windows, je peux faire cela à l'aide de la bibliothèque iPhlpapi.dll via Gestiftable (pour répertorier les adaptateurs réseau) et Getifentry (pour lire les statistiques), mais je ne trouve pas les équivalents Linux / OSX. Ma connaissance de C est assez basique pour que j'apprécierais une solution qui n'est pas trop impliquée. Toute aide serait très appréciée! P>
3 Réponses :
sur Linux: P>
Le titre de la question est OSX. Les deux premiers ne fonctionnent pas sur OSX. Les deux bas ne sont pas adaptés à la question non plus, être graphique et interactif.
La tuile et le corps de la question mentionnent Linux et OSX. Ceci est à propos de la partie Linux
Je ne peux pas parler à OSX mais sur Linux Jetez un coup d'œil sur / proc / net / dev. p>
Si vous faites 'CAT / PROC / NET / DEV' Vous devriez voir des statistiques, y compris les «octets» - le nombre total d'octets de données transmis ou reçus par l'interface. Vous pouvez lire le fichier dans votre propre programme. P>
EDIT: P>
Je n'ai pas lu toute votre question. Cet article devrait vous aider à démarrer avec / proc et a une section sur / proc / net / Dev. P>
Aussi, pour répertorier les interfaces, vous pouvez appeler ioctl avec le option Siocgifconf . Vous pouvez utiliser Google pour un exemple de code décent sur la manière de boucler les données renvoyées. Ou vous pouvez simplement le retirer des données /proc.net/dev mentionnées ci-dessus, ce qui devrait être plus facile. P>
Ou, selon la réponse de Javier, consultez les fichiers sous / sys / class / net / {votre interface réseau} / statistiques code>, où {votre interface réseau} code> est le nom de l'interface réseau que vous souhaitez regarder, par exemple eth0 code> pour la première interface Ethernet. SYSFS (sur / sys code>) est plus récent que les procfs (sur / proc code>).
Le code source Darwin NetStat utilise SYSCTL. Voici un code qui imprime le nombre d'octets de l'intérieur et de l'extérieur sur 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;
}
Cela fonctionne bien sur le simulateur. mais donne une erreur sur le périphérique. Erreur IS- / Users / praveendala / Desktop / Tout dans One3 / App2 / app2 / Main.M: 13: 10: Erreur fatale: fichier "net / route.h" non trouvé.
Je sais que c'est pour OSX. Mais je dois courir sur des périphériques iOS.Tout l'idée?
Bien fait. J'aime aussi vous fournir une solution de l'objectif-C.
Comment puis-je faire cela avec Bash?
Merci pour cet exemple! Je l'ai converti en C ++ en changeant le NsautoreleeePool en STD :: Vecteur du tampon.
De ce que j'ai trouvé jusqu'à présent, vous ne pourrez pas utiliser de code commun sur les deux plates-formes. Il semble que Linux utilise le système de fichiers pour conserver ces informations et la méthode normale de requête des systèmes consiste à lire les fichiers. Sur OSX, les informations sont conservées dans la mémoire et les fichiers obscur.