UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Обратите внимание, что табл. 11.3 описывает только обработку адресов IPv4 и IPv6 функцией
getaddrinfoaddrinfo11.10. Функция getaddrinfo: примеры
Теперь мы покажем некоторые примеры работы функции
getaddrinfoAI_CANONNAMEAI_PASSIVEaddrinfosocketfreebsd % <b>testga -f inet -c -h freebsd4 -s domain</b>socket(AF_INET, SOCK_DGRAM, 17) ai_canonname = freebsd4.unpbook.com address: 135.197.17.100:53socket(AF_INET, SOCK_DGRAM, 17) address: 172:24.37.94:53socket(AF_INET, SOCK_STREAM, 6) ai_canonname = freebsd4.unpbook.com address: 135.197.17.100:53socket(AF_INET, SOCK_STREAM, 6) address: 172.24.37.94:53Параметр
-f inet-h freebsd4-s domainТипичный сценарий клиента — задать семейство адресов, тип сокета (параметр
-tfreebsd % <b>testga -f inet -t stream -h gateway.tuc.noao.edu -s daytime</b>socket(AF_INET, SOCK_STREAM, 6) address: 140.252.108.1:13socket(AF_INET, SOCK_STREAM, 6) address: 140.252.1.4:13socket(AF_INET, SOCK_STREAM, 6) address: 140.252.104.1:13socket(AF_INET, SOCK_STREAM, 0) address: 140.252.3.6.13socket(AF_INET, SOCK_STREAM, 0) address: 140.252.4.100.13socket(AF_INET, SOCK_STREAM, 0) address: 140.252.1.4.13Затем мы задаем наш узел
aixftpfreebsd % <b>testga -h aix -s ftp -t stream</b>socket(AF_NET6, SOCK_STREAM, 6) address: [3ffe:b80:1f8d:2:204:acff:fe17:bf38]:21socket(AF_INET, SOCK_STREAM, 6) address: 192.168.42.2:21Поскольку мы не задали семейство адресов и запустили этот пример на узле, который поддерживает и IPv4, и IPv6, возвращаются две структуры: одна для IPv6 и одна для IPv4.
Затем мы задаем флаг
AI_PASSIVE-рfreebsd % <b>testga -р -s 8888 -t stream</b>socket(AF_INET6, SOCK_STREAM, 6)address: [::]:8888socket(AF_INET, SOCK_STREAM, 6)address: 0.0.0.0:8888Возвращаются две структуры. Поскольку мы запустили эту программу на узле, поддерживающем и IPv4, и IPv6, не задав семейства адресов, функция
getaddrinfo11.11. Функция host_serv
Наш первый интерфейс функции
getaddrinfohost_serv#include "unp.h"struct addrinfo *host_serv(const char *<i>hostname</i>, const char *<i>service</i>, int <i>family</i>, int <i>socktype</i>);<i>Возвращает: в случае успешного выполнения указатель на структуру addrinfo. NULL в случае ошибки</i>В листинге 11.3 показан исходный код этой функции.
Листинг 11.3. Функция host_serv
//lib/host_serv.c 1 #include "unp.h" 2 struct addrinfo* 3 host_serv(const char *host, const char *serv, int family, int socktype) 4 { 5 int n; 6 struct addrinfo hints, *res; 7 bzero(&hints, sizeof(struct addrinfo)); 8 hints.ai_flags = AI_CANONNAME; /* всегда возвращает каноническое имя */ 9 hints.ai_family = family; /* AF_UNSPEC, AF_INET, AF_INET6, ... */
