UNIX: разработка сетевых приложений
Часть 193 из 399 Информация о книге
2 int3 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 else16 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Выводится MTU и те IP-адреса, которые были возвращены.37-46Если мы запустим эту программу на нашем узле
(см. рис. 1.7), то получим следующий результат:macosxmacosx % <b>prifinfo inet4 0</b>lo0: <UP MCAST LOOP >MTU: 16384IP addr: 127.0.0.1en1: <UP BCAST MCAST >MTU: 1500IP addr: 172.24.37.78broadcast addr: 172.24.37.95Первый аргумент командной строки
задает адрес IPv4, а второй, нулевой аргумент указывает, что не должно возвращаться никаких псевдонимов, или альтернативных имен (альтернативные имена IP-адресов мы описываем в разделе А.4). Обратите внимание, что в MacOS X аппаратный адрес интерфейса Ethernet недоступен.inet4Если мы добавим к интерфейсу Ethernet (
) три альтернативных имени адреса с идентификаторами узла 79, 80 и 81 и изменим второй аргумент командной строки на 1, то получим:en1macosx % <b>prifinfo inet4 1</b>lo0: <UP MCAST LOOP >MTU: 16384IP addr: 127.0.0.1en1: <UP BCAST MCAST >MTU: 1500IP addr: 172.24.37.78 <i>первичный IP-адрес</i>broadcast addr: 172.24.37.95en1: <UP BCAST MCAST >MTU: 1500IP addr: 172.24.37.79 <i>первый псевдоним</i>broadcast addr: 172.24.37.95en1: <UP BCAST MCAST >MTU: 1500IP addr: 172 24.37.80 <i>второй псевдоним</i>broadcast addr: 172.24 37.95