UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
11 struct if_nameindex *result, *ifptr;12 char *namptr;13 if ((buf = net_it_iflist(0, 0, &len)) == NULL)14 return (NULL);15 if ((result = malloc(len)) == NULL) /* завышенная оценка */16 return (NULL);17 ifptr = result;18 namptr = (char*)result + len; /* имена начинаются с конца буфера */19 lim = buf + len;20 for (next = buf; next < lim; next += ifm->ifm_msglen) {21 ifm = (struct if_msghdr*)next;22 if (ifm->ifm_type == RTM_IFINFO) {23 sa = (struct sockaddr*)(ifm + 1);24 get_rtaddrs(ifm->ifm_addrs, sa, rti_info);25 if ((sa = rti_infо[RTAX_IFP]) != NULL) {26 if (sa->sa_family == AF_LINK) {27 sdl = (struct sockaddr_in*)sa;28 namptr -= sdl->sdl_nlen + 1;29 strncpy(namptr, &sdl->sdl_data[0], sdl->sdl_nlen);30 namptr[sdl->sdl_nlen] = 0; /* завершающий нуль */31 ifptr->if_name = namptr;32 ifptr->if_index = sdl->sdl_index;33 ifptr++;34 }35 }36 }37 }38 ifptr->if_name = NULL; /* отмечаем конец массива структур */39 ifptr->if_index = 0;40 free(buf);41 return (result); /* вызывающий процесс должен освободить память с помощью free(), когда все сделано */43 }13-18net_rt_iflistif_nameindexif_nameindex22-36RTM_IFINFO38-39if_nameФункция if_freenameindex
Последняя функция, показанная в листинге 18.13, освобождает память, которая была выделена для массива структур
if_nameindexЛистинг 18.14. Освобождение памяти, выделенной функцией if_nameindex
43 void44 if_freenameindex(struct if_nameindex *ptr)45 {46 free(ptr);47 }Эта функция тривиальна, поскольку мы хранили и массив структур, и имена в одном и том же буфере. Если бы мы каждый раз вызывали функцию
mallocfree18.7. Резюме
Последняя из структур адреса сокета, с которой мы встретились в книге, это
sockaddr_dlВ маршрутизирующий сокет процессом могут быть записаны 5 типов сообщений, и 12 различных сообщений могут быть асинхронно возвращены ядром через маршрутизирующий сокет. Мы привели пример, когда процесс запрашивает у ядра информацию о записи в таблице маршрутизации и ядро отвечает со всеми подробностями. Ответы ядра могут содержать до восьми структур адреса сокета, поэтому нам приходится анализировать сообщение, чтобы получить все фрагменты информации.
Функция
sysctlsysctl■ список интерфейсов;
■ таблица маршрутизации;
■ кэш ARP.
Изменения API сокетов, требуемые IPv6, включают четыре функции для сопоставления имен интерфейсов и их индексов. Каждому интерфейсу присваивается уникальный положительный индекс. В Беркли-реализациях с каждым интерфейсом уже связан индекс, поэтому нам несложно реализовать эти функции с помощью функции
sysctlУпражнения
1. Что, как вы считаете, будет хранить поле
sdl_leneth102. В листинге 18.3 отключите параметр сокета
SO_USELOOPBACKwriteГлава 19
Сокеты управления ключами
19.1. Введение
С появлением архитектуры безопасности IP (IPSec, см. RFC 2401 [64]) возникла потребность в стандартном механизме управления индивидуальными ключами шифрования и авторизации. Документ RFC 2367 [73] предлагает универсальный интерфейс управления ключами, который может использоваться с IPSec и иными криптографическими сетевыми службами. Подобно маршрутизирующим сокетам, этот интерфейс принадлежит к отдельному семейству протоколов, которое называется PF_KEY. В этом семействе поддерживаются только символьные сокеты.
