Я ищу способ получить статистику сети в C на Linux и MacOSX. В частности, мне нужно отслеживать количество байтов, загружаемых и загружаемых с каждого сетевого адаптера в системе, - мне не нужно проверять пакет или проводить различие между протоколами, просто счетчик «total bytes», который я могу опросить с интервалами, будет будь умницей. В Windows я могу сделать это, используя библиотеку iphlpapi.dll через GetIfTable (чтобы указать сетевые адаптеры) и GetIfEntry (чтобы прочитать статистику), но я не могу найти эквиваленты Linux/OSX. Мои знания о C являются довольно базовыми, поэтому я был бы признателен за решение, которое не слишком привлекательно. Любая помощь приветствуется!Как получить статистику сетевого адаптера в Linux/Mac OSX?
ответ
на Linux:
Я не могу говорить OSX, но на Linux взгляните на/proc/net/dev.
Если вы делаете «cat/proc/net/dev», вы должны увидеть статистику, включая «байты» - общее количество байтов данных, переданных или полученных интерфейсом. Вы можете прочитать файл в своей собственной программе.
EDIT:
Я не читал весь ваш вопрос. This article должен помочь вам начать работу с/proc и иметь раздел в/proc/net/dev.
Кроме того, чтобы перечислить интерфейсы, вы можете позвонить ioctl с опцией SIOCGIFCONF. Вы можете использовать Google для достойного примера кода о том, как перебирать возвращаемые данные. Или вы можете просто вытащить его из данных /proc.net/dev, упомянутых выше, что должно быть проще.
Или, согласно ответу Хавьера, посмотрите файлы в разделе '/ sys/class/net/{ваш сетевой интерфейс}/statistics', где' {ваш сетевой интерфейс} '- это имя сети интерфейс, на который вы хотите посмотреть, например 'eth0' для первого интерфейса Ethernet. sysfs (on '/ sys') новее, чем procfs (на'/proc'). – 2012-05-21 17:28:01
Исходный код 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;
}
Это отлично работает на симуляторе. но дает ошибку на устройстве. error is-/Пользователи/praveendala/Desktop/all in one3/app2/app2/main.m: 13: 10: фатальная ошибка: файл «net/route.h» не найден. – virata
Я знаю, что это для OSX. но мне нужно запускать ios devices.any идею? – virata
Красиво сделано. Мне нравится, что вы также предоставляете решение Objective-C. – Armand
- 1. Как получить индекс сетевого адаптера?
- 2. Как получить IP-адрес сетевого адаптера
- 3. Поведение сетевого адаптера в режиме мостового адаптера
- 4. Идентификация конкретного сетевого адаптера
- 5. Сброс сетевого адаптера
- 6. Как получить статистику использования диска для удаленного сетевого ресурса?
- 7. Получение IP-адреса сетевого адаптера
- 8. Как изменить имя сетевого адаптера в C#?
- 9. Hyper V: драйверы сетевого адаптера
- 10. Клонирование VM без сетевого адаптера
- 11. HttpURLConnection & Использование специального сетевого адаптера
- 12. Указание сетевого адаптера для SqlConnection
- 13. Как получить широковещательный адрес хоста сетевого адаптера по умолчанию? Java
- 14. Как получить широковещательный адрес хоста сетевого адаптера по умолчанию? C#
- 15. Как получить IP-адрес сетевого адаптера с помощью python?
- 16. Как надежно получить MAC-адрес бортового сетевого адаптера компьютера?
- 17. Настройка сетевого адаптера в переменной в партии
- 18. Проверить скорость сетевого адаптера на OpenBSD
- 19. Возможно использовать ESP8266 в качестве сетевого адаптера?
- 20. Как получить статус сокета при отсоединении сетевого кабеля от сетевого адаптера
- 21. Получите MAC-адрес при отключении сетевого адаптера?
- 22. Как получить статистику пользователя?
- 23. Scapy - как получить статистику?
- 24. Возможно ли получить PnPDeviceId сетевого адаптера без использования WMI?
- 25. Как получить статистику воспроизведения
- 26. Как получить сводную статистику
- 27. Создание сетевого адаптера - насколько это сложно?
- 28. Удаление сетевого адаптера с использованием wmic
- 29. Включение/отключение сетевого адаптера через MSFT_NetAdapter
- 30. Установка средства установки сетевого адаптера Apple
Из того, что я нашел до сих пор, вы не собираетесь быть в состоянии использовать общий код на обеих платформах. Похоже, что Linux использует файловую систему, чтобы сохранить эту информацию, а обычный метод запроса систем - читать файлы. В OSX информация хранится в памяти и неясных файлах. – Armand