UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Если бы мы рассматривали все 64 возможных варианта сочетаний входных данных для функции
getaddrinfo
■ Задание имени узла и службы. Это традиционный случай для клиента TCP и UDP. По завершении клиент TCP перебирает в цикле все возвращаемые IP-адреса, вызывая функции
socket
connect
tcp_connect
Для клиента UDP структура адреса сокета, заполняемая с помощью функции
getaddrinfo
sendto
connect
Если клиент знает, что он обрабатывает только один тип сокета (например, клиентами Telnet и FTP обрабатываются только сокеты TCP, а клиентами TFTP — только сокеты UDP), то элементу
ai_socktype
hints
SOCK_STREAM
SOCK_DGRAM
■ Типичный сервер задает службу (service), но не имя узла (hostname), и задает флаг
AI_PASSIVE
hints
INADDR_ANY
IN6ADDR_ANY_INIT
socket
bind
listen
malloc
accept
ai_addrlen
Сервер UDP вызовет функции
socket
bind
recvfrom
malloc
recvfrom
ai_addrlen
Как и в случае типичного клиентского кода, если сервер знает, что он обрабатывает только один тип сокета, то элемент
ai_socktype
hints
SOCK_STREAM
SOCK_DGRAM
ai_socktype
■ До сих пор мы демонстрировали серверы TCP, создающие один прослушиваемый сокет, и серверы UDP, создающие один сокет дейтаграмм. Это тот вариант, который подразумевался в предыдущем абзаце. Альтернативным устройством является сервер, который обрабатывает множество сокетов с помощью функции
select
getaddrinfo
select
Проблема этой технологии состоит в том, что условие, по которому функция getaddrinfo возвращает множество структур, возникает, когда служба может обрабатываться как протоколом IPv4, так и протоколом IPv6 (см. табл. 11.3). Но эти два протокола не полностью независимы, как мы увидели в разделе 10.2, то есть если мы создаем прослушиваемый сокет IPv6 для данного порта, нет необходимости создавать для него прослушиваемый сокет IPv4, поскольку соединения, приходящие от клиентов IPv4, автоматически обрабатываются стеком протоколов и прослушиваемым сокетом IPv6, при условии, что параметр сокета IPV6_V6ONLY не установлен.
Невзирая на тот факт, что функция
getaddrinfo
gethostbyname
gethostbyaddr
hints
getaddrinfo
Функция
getaddrinfo
getnameinfo
11.7. Функция gai_strerror
Ненулевые значения ошибок, возвращаемых функцией
getaddrinfo
gai_strerror
#include <netdb.h>
char *gai_strerror(int <i>error</i>);
<i>Возвращает: указатель на строку с описанием ошибки</i>
Таблица 11.2. Ненулевые возвращаемые значения (константы) ошибок функции getaddrinfo
Константа | Описание |
---|---|
EAI_AGAIN | Временный сбой при попытке разрешения имен |
EAI_BADFLAGS | Недопустимое значение ai_flags |
EAI_FAIL | Неисправимая ошибка при разрешении имен |
EAI_FAMILY | Семейство ai_family не поддерживается |
EAI_MEMORY | Ошибка при выделении памяти |
EAI_NONAME | Имя узла или имя службы неизвестны или равны NULL |
EAI_OVERFLOW | Переполнен буфер пользовательских аргументов (только для getnameinfo) |
EAI_SERVICE | Запрошенная служба не поддерживается для данного типа сокета ai_socktype |
EAI_SOCKTYPE | Тип сокета ai_socktype не поддерживается |
EAI_SYSTEM | Другая системная ошибка, возвращаемая в переменной errno |