The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"получить список интерфейсов"
Отправлено be, 18-Янв-06 09:14 
>Я никак не могу понять, как можно програмно определить сетевые интерфейсы(желательно без
>/proc =) ). Есть подозрение, что через ioctl.
ОС нужно указывать, относительно freebsd 4.10,4.11 (5.4 не проверено(?))

....
void
list_ifaces(arg)
    int arg[];
{
    arg[0] = CTL_NET;
    arg[1] = PF_ROUTE;
    arg[5] = arg[3] = arg[2] = 0;
    arg[4] = NET_RT_IFLIST;
}

int mib[6];
char *ptr, *nptr, *limit, *next;
size_t if_buf = 0, needed = 0;

....
list_ifaces(&mib);

if(sysctl(mib, 6, NULL, &if_buf, NULL, 0) < 0) {
      printf("sysctl() %s\n", strerror(errno));
      return EXIT_FAILURE;
}

next = ptr = malloc(if_buf);

if (sysctl(mib, 6, ptr, &if_buf, NULL, 0) < 0) {
      printf("sysctl() %s\n", strerror(errno));
      free(ptr);
      return EXIT_FAILURE;
}

limit = ptr + if_buf;

while(next < limit) {
     ifm = (struct if_msghdr *) next;
     if((ifm->ifm_flags & IFF_UP) && (ifm->ifm_flags | IFF_LOOPBACK)) {
           memset(if_name, 0, IFNAMSIZ);
           if_indextoname(ifm->ifm_index, (char *)&if_name);
#if RELEASE == 410
           sdl = (struct sockaddr_dl *)(ifm + 1);
#else
           sdl = (struct sockaddr_dl *)((char *)ifm + sizeof(struct if_msghdr) - sizeof(struct if_data) + ifm->ifm_data.ifi_datalen);
#endif
           printf("index:%s, mtu:%ld\n", if_name, ifm->ifm_data.ifi_mtu);
           printf("\tinput:%lu\n\toutput:%lu\n",ifm->ifm_data.ifi_ibytes,  ifm->ifm_data.ifi_obytes);
           printf("\t%s\n", ether_ntoa((struct ether_addr *)LLADDR(sdl)));
      }
           next += ifm->ifm_msglen;
           ifam = NULL;
           while(next < limit) {
                nextifm = (struct if_msghdr *)next;
                if (nextifm->ifm_type != RTM_NEWADDR)
                          break;
                if (ifam == NULL)
                          ifam = (struct ifa_msghdr *)nextifm;
                next += nextifm->ifm_msglen;
        }
}

free(ptr);
...

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру