10
votes

Comment obtenir des stats d'adaptateur réseau sous Linux / Mac OSX?

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!


1 commentaires

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.


3 Réponses :


1
votes

sur Linux:

  • Niveau bas: Vérifiez / SYS / Classe / Net / Eth0 / Statistiques /
  • Niveau légèrement supérieur: IP -S Link Afficher Eth0
  • graphique: IFTOP
  • interactif: iptraf

2 commentaires

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



1
votes

Je ne peux pas parler à OSX mais sur Linux Jetez un coup d'œil sur / proc / net / dev.

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.

EDIT:

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.

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.


1 commentaires

Ou, selon la réponse de Javier, consultez les fichiers sous / sys / class / net / {votre interface réseau} / statistiques , où {votre interface réseau} est le nom de l'interface réseau que vous souhaitez regarder, par exemple eth0 pour la première interface Ethernet. SYSFS (sur / sys ) est plus récent que les procfs (sur / proc ).



25
votes

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;
}


5 commentaires

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.