2009-07-14 2 views
8

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

+0

Из того, что я нашел до сих пор, вы не собираетесь быть в состоянии использовать общий код на обеих платформах. Похоже, что Linux использует файловую систему, чтобы сохранить эту информацию, а обычный метод запроса систем - читать файлы. В OSX информация хранится в памяти и неясных файлах. – Armand

ответ

2

на Linux:

  • низкий уровень: проверить /sys/class/net/eth0/statistics/
  • немного более высокий уровень: ip -s link show eth0
  • графический: iftop
  • интерактивными: iptraf
+4

Вопрос о OSX. Первые два не работают на OSX. Внизу два не подходят для вопросов, будь то графические и интерактивные. – Purrell

+2

как плитка, так и тело вопроса упоминают Linux и OSX. это касается части Linux. – Javier

1

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

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

EDIT:

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

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

+0

Или, согласно ответу Хавьера, посмотрите файлы в разделе '/ sys/class/net/{ваш сетевой интерфейс}/statistics', где' {ваш сетевой интерфейс} '- это имя сети интерфейс, на который вы хотите посмотреть, например 'eth0' для первого интерфейса Ethernet. sysfs (on '/ sys') новее, чем procfs (на'/proc'). – 2012-05-21 17:28:01

20

Исходный код Darwin 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; 
} 
+0

Это отлично работает на симуляторе. но дает ошибку на устройстве. error is-/Пользователи/praveendala/Desktop/all in one3/app2/app2/main.m: 13: 10: фатальная ошибка: файл «net/route.h» не найден. – virata

+0

Я знаю, что это для OSX. но мне нужно запускать ios devices.any идею? – virata

+0

Красиво сделано. Мне нравится, что вы также предоставляете решение Objective-C. – Armand

Смежные вопросы