UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
83 #ifndef INET6_ADDRSTRLEN 84 #define INET6_ADDRSTRLEN 46 /* максимальная длина строки адреса IPv6: 85 "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx" или 86 "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:ddd.ddd.ddd.ddd " 87 1234567890123456789012345678901234567890123456 */ 88 #endif 89 /* Определяем bzero() как макрос, если эта функция отсутствует в стандартной библиотеке С */ 90 #ifndef HAVE_BZERO 91 #define bzero(ptr,n) memset(ptr, 0, n) 92 #endif 93 /* В более старых распознавателях отсутствует gethostbyname2() */ 94 #ifndef HAVE_GETHOSTBYNAME2 95 #define gethostbyname2(host, family) gethostbyname((host)) 96 #endif 97 /* Структура, возвращаемая функцией recvfrom_flags() */ 98 struct in_pktinfo { 99 struct in_addr ipi_addr; /* IPv4-адрес получателя */100 int ipi_ifindex; /* полученный индекс интерфейса */101 };102 /* Нам нужны более новые макросы CMSG_LEN() и CMSG_SPACE(), но в103 настоящее время их поддерживают далеко не все реализации. Им требуется104 макрос ALIGN(), но это зависит от реализации */105 #ifndef CMSG_LEN106 #define CMSG_LEN(size) (sizeof(struct cmsghdr) + (size))107 #endif108 #ifndef CMSG_SPACE109 #define CMSG_SPACE(size) (sizeof(struct cmsghdr) + (size))110 #endif111 /* POSIX требует макрос SUN_LEN(), но он определен112 не во всех реализациях. Этот макрос 4.4BSD работает123 независимо от того, имеется ли поле длины */114 #ifndef SUN_LEN115 #define SUN_LEN(su) 116 (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))117 #endif118 /* В POSIX "домен Unix" называется "локальным IPC".119 Но пока не во всех системах определены AF_LOCAL и PF_LOCAL */120 #ifndef AF_LOCAL121 #define AF_LOCAL AF_UNIX122 #endif123 #ifndef PF_LOCAL124 #define PF_LOCAL PF_UNIX125 #endif126 /* POSIX требует определения константы INFTIM в <poll.h>, но во многих127 системах она по-прежнему определяется в <sys/stropts.h>. Чтобы128 не подключать все функции работы с потоками, определяем ее здесь.129 Это стандартное значение, но нет гарантии, что оно равно -1 */130 #ifndef INFTIM131 #define INFTIM (-1) /* бесконечный тайм-аут */132 #ifdef HAVE_POLL_H133 #define INFTIM_UNPH /* надо указать в unpxti.h, что эта константа определена здесь */134 #endif135 #endif136 /* Это значение можно было бы извлечь из SOMAXCONN в <sys/socket.h>,137 но многие ядра по-прежнему определяют его как 5, хотя на самом деле поддерживается гораздо больше */138 #define LISTENQ 1024 /* второй аргумент функции listen() */139 /* Различные константы */140 #define MAXLINE 4096 /* максимальная длина текстовой строки */141 #define BUFFSIZE 8192 /* размер буфера для чтения и записи */142 /* Определение номера порта, который может быть использован для взаимодействия клиент-сервер */143 #define SERV_PORT 9877 /* клиенты и серверы TCP и UDP */144 #define SERV_PORT_STR "9877" /* клиенты и серверы TCP и UDP */145 #define UNIXSTR_PATH "/tmp/unix.str" /* потоковые клиенты и серверы домена Unix */146 #define UNIXDG_PATH "/tmp/unix.dg" /* клиенты и серверы протокола дейтаграмм домена Unix */147 /* Дальнейшие определения сокращают преобразования типов аргументов-указателей */148 #define SA struct sockaddr149 #define HAVE_STRUCT_SOCKADDR_STORAGE150 #ifndef HAVE_STRUCT_SOCKADDR_STORAGE151 /*152 * RFC 3493: протокольно-независимая структура адреса сокета153 */154 #define __SS_MAXSIZE 128155 #define __SS_ALIGNSIZE (sizeof(int64_t))156 #ifndef HAVE_SOCKADDR_SA_LEN157 #define __SS_PADS1SIZE (__SS_ALIGNSIZE - sizeof(u_char) -
