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_V4MAPPED
recvfrom
Как пример приложения, которому нужен этот макрос, можно привести FTP и его команду
PORT
dir
PORT
PORT a1, a2, a3, a4, p1, p2
EPRT
12.5. Переносимость исходного кода
Большинство существующих сетевых приложений написаны для IPv4. Структуры
sockaddr_in
socket
AF_INET
Если мы преобразуем приложение для работы с IPv6 и распространим его исходный код, нам придется думать о том, поддерживает ли принимающая система протокол IPv6. Типичный способ решения этой проблемы — применять в коде
#ifdef
#ifdef
Наилучшим подходом будет рассмотрение перехода на IPv6 как возможности сделать программу не зависящей от протокола. Первым шагом здесь будет удаление вызовов функций
gethostbyname
gethostbyaddr
getaddrinfo
getnameinfo
bind
connect
recvfrom
sock_XXX
#ifdef
mcast_XXX
Другой момент, который нужно учесть, — что произойдет, если мы откомпилируем наш исходный код в системе, поддерживающей и IPv4, и IPv6, затем распространим либо исполняемый код, либо объектные файлы (но не исходный код) и кто-то запустит наше приложение в системе, не поддерживающей IPv6. Есть вероятность, что сервер локальных имен поддерживает записи типа AAAA и возвращает как записи типа AAAA, так и записи типа А некоему собеседнику, с которым пытается соединиться наше приложение. Если наше приложение, работающее с IPv6, вызовет функцию
socket
socket