UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Хотя четверть из представленных в таблице сочетаний недопустима, в обозримом будущем большинство реализаций IPv6 будут использоваться на узлах с двойным стеком протоколов и поддерживать не только IPv6. Если мы удалим из таблицы вторую строку и вторую колонку, все записи «Нет» исчезнут и единственной проблемой останется запись, помеченная звездочкой.
12.4. Макроопределения проверки адреса IPv6
Существует небольшой класс приложений IPv6, которые должны знать, с каким собеседником они взаимодействуют (IPv4 или IPv6). Эти приложения должны знать, является ли адрес собеседника адресом IPv4, преобразованным к виду IPv6. Определены двенадцать макросов, проверяющих некоторые свойства адреса Ipv6.
#include <netinet/in.h>int IN6_IS_ADDR_UNSPECIFIED(const struct in6_addr *<i>aptr</i>);int IN6_IS_ADDR_LOOPBACK(const struct in6_addr *<i>aptr</i>);int IN6_IS_ADDR_MULTICAST(const struct in6_addr *<i>aptr</i>);int IN6_IS_ADDR_LINKLOCAL(const struct in6_addr *<i>aptr</i>);int IN6_IS_ADDR_SITELOCAL(const struct in6_addr *<i>aptr</i>);int IN6_IS_ADDR_V4MAPPED(const struct in6_addr *<i>aptr</i>);int IN6_IS_ADDR_V4COMPAT(const struct in6_addr *<i>aptr</i>);int IN6_IS_ADDR_MC_NODELOCAL(const struct in6_addr *<i>aptr</i>);int IN6_IS_ADDR_MC_LINKLOCAL(const struct in6_addr *<i>aptr</i>);int IN6_IS_ADDR_MC_SITELOCAL(const struct in6_addr *<i>aptr</i>);int IN6_IS_ADDR_MC_ORGLOCAL(const struct in6_addr *<i>aptr</i>);int IN6_IS_ADDR_MC_GLOBAL(const struct in6_addr *<i>aptr</i>);<i>Все возвращают: ненулевое значение, если адрес IPv6 имеет указанный тип, 0 в противном случае</i>Первые семь макросов проверяют базовый тип адреса IPv6. Мы покажем различные типы адресов в разделе А.5. Последние пять макросов проверяют область действия адреса многоадресной передачи IPv6 (см. раздел 19.2).
Клиент IPv6 может вызвать макрос
IN6_IS_ADDR_V4MAPPEDrecvfromКак пример приложения, которому нужен этот макрос, можно привести FTP и его команду
PORTdirPORTPORT a1, a2, a3, a4, p1, p2EPRT12.5. Переносимость исходного кода
Большинство существующих сетевых приложений написаны для IPv4. Структуры
sockaddr_insocketAF_INETЕсли мы преобразуем приложение для работы с IPv6 и распространим его исходный код, нам придется думать о том, поддерживает ли принимающая система протокол IPv6. Типичный способ решения этой проблемы — применять в коде
#ifdef#ifdefНаилучшим подходом будет рассмотрение перехода на IPv6 как возможности сделать программу не зависящей от протокола. Первым шагом здесь будет удаление вызовов функций
gethostbynamegethostbyaddrgetaddrinfogetnameinfobindconnectrecvfromsock_XXX#ifdefmcast_XXXДругой момент, который нужно учесть, — что произойдет, если мы откомпилируем наш исходный код в системе, поддерживающей и IPv4, и IPv6, затем распространим либо исполняемый код, либо объектные файлы (но не исходный код) и кто-то запустит наше приложение в системе, не поддерживающей IPv6. Есть вероятность, что сервер локальных имен поддерживает записи типа AAAA и возвращает как записи типа AAAA, так и записи типа А некоему собеседнику, с которым пытается соединиться наше приложение. Если наше приложение, работающее с IPv6, вызовет функцию
socketsocket
