Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:

4 if_nametoindex(const char *name)

5 {

6 unsigned int idx, namelen;

7 char *buf, *next, *lim;

8 size_t len;

9 struct if_msghdr *ifm;

10 struct sockadd *sa, *rti_info[RTAX_MAX];

11 struct sockaddr_dl *sdl;

12 if ((buf = net_rt_iflist(0, 0, &len)) == NULL)

13 return(0);

14 namelen = strlen(name);

15 lim = buf + len;

16 for (next = buf; next < lim; next += ifm->ifm_msglen) {

17 ifm = (struct if_msghdr*)next;

18 if (ifm->ifm_type == RTM_IFINFO) {

19 sa = (struct sockaddr*)(ifm + 1);

20 get_rtaddrs(ifm->ifm_addrs, sa, rti_info);

21 if ((sa = rti_infо[RTAX_IFP]) != NULL) {

22 if (sa->sa_family == AF_LINK) {

23 sdl = (struct sockaddr_dl*)sa;

24 if (sdl->sdl_nlen == namelen

25 && strncmp(&sdl->sdl_data[0], name,

26 sdl->sdl_nlen) == 0) {

27 idx = sdl->sdl_index; /* сохранение перед

вызовом free */

28 free(buf);

29 return(idx);

30 }

31 }

32 }

33 }

34 }

35 free(buf);

36 return(0); /* индекс для имени не найден */

37 }

Получение списка интерфейсов

12-13
Наша функция
net_rt_iflist
возвращает список интерфейсов.

Обработка только сообщений RTM_IFINFO

17-30
Мы обрабатываем сообщения в буфере (см. рис. 18.4) в поисках сообщений типа
RTM_IFINFO
. Найдя такое сообщение, мы вызываем нашу функцию
get_rtaddrs
, чтобы установить указатели на структуры адреса сокета, а если присутствует структура имени интерфейса (элемент
RTAX_IFP
массива
rti_info
), то имя интерфейса сравнивается с аргументом.

Функция if_indextoname

Следующая функция,

if_indextoname
, показана в листинге 18.12.

Листинг 18.12. Возвращение имени интерфейса по его индексу

libroute/if_indextoname.c

1 #include "unpifi.h"

2 #include "unproute.h"

3 char*

4 if_indextoname(unsigned int index, char *name)

5 {

6 char *buf, *next, *lim;

7 size_t len;

8 struct if_msghdr *ifm;

9 struct sockaddr *sa, *rti_info[RTAX_MAX];

10 struct sockaddr_dl *sdl;

11 if ((buf = net_rt_iflist(0, index, &len)) == NULL)

12 return (NULL);

13 lim = buf + len;

14 for (next = buf; next < lim; next += ifm->ifm_msglen) {

  • Читать дальше
  • 1
  • ...
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: