UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
58 }59 ifam = (struct ifa_msghdr*)next;60 sa = (struct sockaddr*)(ifam + 1);61 get_rtaddrs(ifam->ifam_addrs, sa, rti_info);62 if ((sa = rti_infо[RTAX_IFA]) != NULL) {63 ifi->ifi_addr = Calloc(1, sa->sa_len);64 memcpy(ifi->ifi_addr, sa, sa->sa_len);65 }66 if ((flags & IFF_BROADCAST) && (sa = rti_infо[RTAX_BRD]) |= NULL) {67 ifi->ifi_brdaddr = Calloc(1, sa->sa_len);68 memcpy(ifi->ifi_brdaddr, sa, sa->sa_len);69 }70 if ((flags & IFF_POINTOPOINT) &&71 (sa = rti_infо[RTAX_BRD]) != NULL) {72 ifi->ifi_dstaddr = Calloc(1, sa->sa_len);73 memcpy(ifi->ifi_dstaddr, sa, sa->sa_len);74 }75 } else76 err_quit("unexpected message type %d", ifm->ifm_type);77 }78 /* "ifihead" указывает на первую структуру в связном списке */79 return (ifihead); /* указатель на первую структуру в связном списке */80 }44-65RTM_NEWADDRsysctlifi_info66-7518.6. Функции имени и индекса интерфейса
Документ RFC 3493 [36] определяет четыре функции, обрабатывающие имена и индексы интерфейсов. Эти четыре функции используются во многих случаях, когда необходимо описать интерфейс. Они были предложены в процессе разработки API IPv6 (главы 21 и 27), однако индексы интерфейсов имеются и в API IPv4 (например, в вызове
IP_RECVIFAF_LINK#include <net/if.h>unsigned int if_nametoindex(const char *<i>ifname</i>);<i>Возвращает: положительный индекс интерфейса в случае успешного выполнения, 0 в случае ошибки</i>char *if_indextoname(unsigned int <i>ifindex</i>, char *<i>ifname</i>);<i>Возвращает: указатель на имя интерфейса в случае успешного выполнения, NULL в случае ошибки</i>struct if_nameindex *if_nameindex(void);<i>Возвращает: непустой указатель в случае успешного выполнения, NULL в случае ошибки</i>void if_freenameindex(struct if_nameindex *<i>Iptr</i>);Функция
if_nametoindexifnameif_indextonameifindexifnameIFNAMSIZif_indextonameФункция
if_nameindexif_nameindexstruct if_nameindex { unsigned int if_index; /* 1, 2. ... */ char *if_name; /* имя, завершаемое нулем: "le0", ... */};Последняя запись в этом массиве содержит структуру с нулевым индексом
if_indexifnameif_freenameindexТеперь мы представим реализацию этих четырех функций с использованием маршрутизирующих сокетов.
Функция if_nametoindex
В листинге 18.11 показана функция
if_nametoindexЛистинг 18.11. Возвращение индекса интерфейса по его имени
//libroute/if_nametoindex.c 1 #include "unpifi.h" 2 #include "unproute.h" 3 unsigned int 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;
