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

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

Шрифт:

Перед тем как представить реализацию нашей функции

ifi_info
, мы покажем простую программу, которая вызывает эту функцию и затем выводит информацию. Эта программа, представленная в листинге 17.3, является уменьшенной версией программы
ifconfig
.

Листинг 17.3. Программа prifinfo, вызывающая нашу функцию ifi_info

//ioctl/prifinfo.c

1 #include "unpifi.h"

2 int

3 main(int argc, char **argv)

4 {

5 struct ifi_info *ifi, *ifihead;

6 struct sockaddr *sa;

7 u_char *ptr;

8 int i, family, doaliases;

9 if (argc != 3)

10 err_quit("usage: prifinfo <inet4|inet6> <doaliases>");

11 if (strcmp(argv[1], "inet4") == 0)

12 family = AF_INET;

13 else if (strcmp(argv[1], "inet6") == 0)

14 family = AF_INET6;

15 else

16 err_quit("invalid <address-family>");

17 doaliases = atoi(argv[2]);

18 for (ifihead = ifi = Get_ifi_info(family, doaliases);

19 ifi ! = NULL; ifi = ifi->ifi_next) {

20 printf("%s: <", ifi->ifi_name);

21 if (ifi->ifi_index != 0)

22 printf("%d) ", ifi->ifi_index);

23 printf("<");

24 if (ifi->ifi_flags & IFF_UP) printf ("UP ");

25 if (ifi->ifi_flags & IFF_BROADCAST) printf("BCAST ");

26 if (ifi->ifi_flags & IFF_MULTICAST) printf("MCAST ");

27 if (ifi->ifi_flags & IFF_LOOPBACK) printf("LOOP ");

28 if (ifi->ifi_flags & IFF_POINTOPOINT) printf("P2P ");

29 printf(">\n");

30 if ((i = ifi->ifi_hlen) > 0) {

31 ptr = ifi->ifi_haddr;

32 do {

33 printf("%s%x", (i == ifi->ifi_hlen) ? " " : ":", *ptr++);

34 } while (--i > 0);

35 printf("\n");

36 }

37 if (ifi->ifi_mtu != 0)

38 printf(" MTU: %d\n". ifi->ifi_mtu);

39 if ((sa = ifi->ifi_addr) != NULL)

40 printf(" IP addr: %s\n", Sock_ntop_host(sa, sizeof(*sa)));

41 if ((sa = ifi->ifi_brdaddr) != NULL)

42 printf(" broadcast addr, %s\n",

43 Sock_ntop_host(sa, sizeof(*sa)));

44 if ((sa = ifi->ifi_dstaddr) != NULL)

45 printf(" destination addr %s\n\",

46 Sock_ntop_host(sa, sizeof(*sa)));

47 }

48 free_ifi_info(ifihead);

49 exit(0);

59 }

18-47
Программа представляет собой цикл
for
, в котором один раз вызывается функция
get_ifi_info
, а затем последовательно перебираются все возвращаемые структуры
ifi_info
.

20-36
Выводятся все имена интерфейсов и флаги. Если длина аппаратного адреса больше нуля, он выводится в виде шестнадцатеричного числа (наша функция
get_ifi_info
возвращает нулевую длину
ifi_hlen
, если адрес недоступен).

  • Читать дальше
  • 1
  • ...
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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