Как получить статистику сетевого адаптера в Linux / Mac OSX? - PullRequest
8 голосов
/ 14 июля 2009

Я ищу способ получить статистику сети в C на Linux и MacOSX. В частности, мне нужно отслеживать количество байтов, загруженных и загруженных с каждого сетевого адаптера в системе - мне не нужно выполнять проверку пакетов или различать протоколы, просто счетчик «общего количества байтов», который я могу опрашивать с интервалами, будет быть в порядке. В Windows я могу сделать это, используя библиотеку iphlpapi.dll через GetIfTable (для просмотра списка сетевых адаптеров) и GetIfEntry (для чтения статистики), но я не могу найти эквиваленты Linux / OSX. Мои знания C довольно просты, поэтому я был бы признателен за решение, которое не слишком сложное. Любая помощь будет высоко ценится!

Ответы [ 3 ]

21 голосов
/ 06 сентября 2009

Исходный код Дарвина netstat использует sysctl. Вот некоторый код, который печатает количество байтов в 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;
}
2 голосов
/ 14 июля 2009

Я не могу говорить с OSX, но на Linux посмотрите /proc/net/dev.

Если вы выполните команду «cat / proc / net / dev», вы должны увидеть статистику, включающую «байты» - общее количество байтов данных, переданных или полученных интерфейсом. Вы можете прочитать файл в вашей собственной программе.

EDIT:

Я не прочитал весь ваш вопрос. Эта статья должна помочь вам начать работу с / proc и имеет раздел в /proc/net/dev.

.

Кроме того, для получения списка интерфейсов вы можете вызвать ioctl с опцией SIOCGIFCONF . Вы можете использовать Google для приличного примера кода о том, как перебрать возвращенные данные. Или вы можете просто извлечь это из данных /proc.net/dev, упомянутых выше, что должно быть проще.

2 голосов
/ 14 июля 2009

в Linux:

  • низкий уровень: проверка /sys/class/net/eth0/statistics/
  • немного более высокий уровень: ip -s link show eth0
  • Графический: iftop
  • интерактивный: iptraf
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...