UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
POSIX определяет функцию
pselectФункция
pollselectselectpollУпражнения
1. Мы говорили, что набор дескрипторов можно присвоить другому набору дескрипторов, используя оператор присваивания языка С. Как это сделать, если набор дескрипторов является массивом целых чисел? (Подсказка: посмотрите на свой системный заголовочный файл
<sys/select.h><sys/types.h>2. Описывая в разделе 6.3 условия, при которых функция
select3. Что произойдет с программой из листинга 6.1, если мы поставим слово
elseif4. В листинге 6.3 добавьте необходимый код, чтобы позволить серверу использовать максимальное число дескрипторов, допустимое ядром (Подсказка: изучите функцию
setrlimit5. Посмотрите, что происходит, если в качестве второго аргумента функции
shutdownSHUT_RDSERV_PORTchargenstr_clipausechargentcpdump6. Почему приложение должно вызывать функцию
shutdownSHUT_RDWRclose7. Что происходит в листинге 6.4, когда клиент отправляет RST для завершения соединения?
8. Перепишите код, показанный в листинге 6.5, чтобы вызывать функцию
sysconfclientГлава 7
Параметры сокетов
7.1. Введение
Существуют различные способы получения и установки параметров сокетов:
■ функции
getsockoptsetsockopt■ функция
fcntl■ функция
ioctlЭту главу мы начнем с описания функций
getsockoptsetsockoptМы также рассмотрим функцию
fcntlioctl7.2. Функции getsockopt и setsockopt
Эти две функции применяются только к сокетам.
#include <sys/socket.h>int getsockopt(int <i>sockfd</i>, int <i>level</i>, int <i>optname</i>, void *<i>optval</i>, socklen_t *<i>optlen</i>);int setsockopt(int <i>sockfd</i>, int <i>level</i>, int <i>optname</i>, const void *<i>optval</i>, socklen_t <i>optlen</i>);<i>Обе функции возвращают 0 в случае успешного завершения, -1 в случае ошибки</i>Переменная
sockfdleveloptvalsetsockoptgetsockoptsetsockoptgetsockoptВ табл. 7.1 и 7.2 сведены параметры, которые могут запрашиваться функцией
getsockoptsetsockoptoptvallinger{}struct lingerТаблица 7.1. Параметры сокетов для функций getsockopt и setsockopt
| level | optname | get | set | Описание | Флаг | Тип данных |
|---|---|---|---|---|---|---|
| SOL_SOCKET | SO_BROADCAST | • | • | Позволяет посылать широковещательные дейтаграммы | • | int |
| SO_DEBUG | • | • | Разрешает отладку | • | int | |
| SO_DONTROUTE | • | • | Обходит таблицу маршрутизации | • | int | |
| SO_ERROR | • | Получает ошибку, ожидающую обработки, и возвращает значение параметра в исходное состояние | int | |||
| SO_KEEPALIVE | • | • | Периодически проверяет, находится ли соединение в рабочем состоянии | • | int | |
| SO_LINGER | • | • | Задерживает закрытие сокета, если имеются данные для отправки | linger{} | ||
| SO_OOBINLINE | • | • | Оставляет полученные внеполосные данные вместе с обычными данными (inline) | • | int | |
| SO_RCVBUF | • | • | Размер приемного буфера | int | ||
| SO_SNDBUF | • | • | Размер буфера отправки | int | ||
| SO_RCVLOWAT | • | • | Минимальное количество данных для приемного буфера сокета | int | ||
| SO_SNDLOWAT | • | • | Минимальное количество данных для буфера отправки сокета | int | ||
| SO_RCVTIMEO | • | • | Тайм-аут при получении | timeval{} | ||
| SO_SNDTIMEO | • | • | Тайм-аут при отправке | timeval{} | ||
| SO_REUSEADDR | • | • | Допускает повторное использование локального адреса | • | int | |
| SO_REUSEPORT | • | • | Допускает повторное использование локального адреса | • | int | |
| SO_TYPE | • | Возвращает тип сокета | int | |||
| SO_USELOOPBACK | • | • | Маршрутизирующий сокет получает копию того, что он отправляет | • | int | |
| IPPROTO_IP | IP_HDRINCL | • | • | Включается IP- заголовок | • | int |
| IP_OPTIONS | • | • | В заголовке IPv4 устанавливаются параметры IP | см. текст | ||
| IP_RECVDSTADDR | • | • | Возвращает IP-адрес получателя | • | int | |
| IP_RECVIF | • | • | Возвращает индекс интерфейса, на котором принимается дейтаграмма UDP | • | int | |
| IP_TOS | • | • | Тип сервиса и приоритет | int | ||
| IP_TTL | • | • | Время жизни | int | ||
| IP_MULTICAST_IF | • | • | Задает интерфейс для исходящих дейтаграмм | in_addr{} | ||
| IP_MULTICAST_TTL | • | • | Задает TTL для исходящих дейтаграмм | u_char | ||
| IP_MULTICAST_LOOP | • | • | Разрешает или отменяет отправку копии дейтаграммы на тот узел, откуда она была послана (loopback) | u_char | ||
| IP_ADD_MEMBERSHIP | • | Включение в группу многоадресной передачи | ip_mreq{} | |||
| IP_DROP_MEMBERSHIP | • | Отключение от группы многоадресной передачи | ip_mreq{} | |||
| IP_{BLOCK, UNBLOCK}_SOURCE | • | Блокирование и разблокирование источника многоадресной передачи | ip_mreq_source{} | |||
| IP_{ADD, DROP}_SOURCE_MEMBERSHIP | • | Присоединение или отключение от многоадресной передачи от источника (source-specific) | ip_mreq_source{} | |||
| IPPROTO_ICMPV6 | ICMP6_FILTER | • | • | Указывает тип сообщения ICMPv6, которое передается процессу | icmp6_filter{} | |
| IPPROTO_IPV6 | IPV6_ADDRFORM | • | • | Меняет формат адреса сокета | int | |
| IPV6_CHECKSUM | • | • | Отступ поля контрольной суммы для символьных (неструктурированных) сокетов | int | ||
| IPV6_DONTFRAG | • | • | Не фрагментировать, а сбрасывать большие пакеты | • | int | |
| IPV6_NEXTHOP | • | • | Задает следующий транзитный адрес | • | sockaddr{} | |
| IPV6_PATHMTU | • | Получение текущей маршрутной МТУ | ip6_mtuinfo{} | |||
| IPV6_RECVDSTOPTS | • | • | Получение параметров адресата | • | int | |
| IPV6_RECVHOPLIMIT | • | • | Получение ограничения на количество транзитных узлов при направленной передаче | • | int | |
| IPV6_RECVHOPOPTS | • | • | Получение параметров прыжков | • | int | |
| IPV6_RECVPATHMTU | • | • | Получение маршрутной MTU | • | int | |
| IPV6_RECVPKTINFO | • | • | Получение информации о пакетах | • | int | |
| IPV6_RECVRTHDR | • | • | Получение маршрута от источника | • | int | |
| IPV6_RECVTCLASS | • | • | Получение класса трафика | • | int | |
| IPV6_UNICAST_HOPS | • | • | Предел количества транзитных узлов, задаваемый по умолчанию | int | ||
| IPV6_USE_MIN_MTU | • | • | Использовать минимальную MTU | • | int | |
| IPV6_V60NLY | • | • | Отключить совместимость с IPv4 | • | int | |
| IPV6_XXX | • | • | Вспомогательные данные | см. текст | ||
| IPV6_MULTICAST_IF | • | • | Задает интерфейс для исходящих дейтаграмм | u_int | ||
| IPV6_MULTICAST_HOPS | • | • | Задает предельное количество транзитных узлов для исходящих широковещательных сообщений | int | ||
| IPV6_MULTICAST_LOOP | • | • | Разрешает или отменяет отправку копии дейтаграммы на тот узел, откуда она была послана (loopback) | • | u_int | |
| IPV6_LEAVE_GROUP | • | Выход из группы многоадресной передачи | ipv6_mreq{} | |||
| IPPROTO_IP или IPPROTO_IPV6 | MCAST_JOIN_GROUP | • | Присоединение к группе многоадресной передачи | group_req{} | ||
| MCAST_LEAVE_GROUP | • | Выход из группы многоадресной передачи | group_source_req{} | |||
| MCAST_BLOCK_SOURCE | • | Блокирование источника многоадресной передачи | group_source_req{} | |||
| MCAST_UNBLOCK_SOURCE | • | Разблокирование источника многоадресной передачи | group_source_req{} | |||
| MCAST_JOIN_SOURCE_GROUP | • | Присоединение к группе многоадресной передачи от источника | group_source_req{} | |||
| MCAST_LEAVE_SOURCE_GROUP | • | Выход из группы многоадресной передачи от источника | group_source_req{} |
