Шрифт:
6. Почему приложение должно вызывать функцию
shutdown
с аргументом SHUT_RDWR
, вместо того чтобы просто вызвать функцию close
? 7. Что происходит в листинге 6.4, когда клиент отправляет RST для завершения соединения?
8. Перепишите код, показанный в листинге 6.5, чтобы вызывать функцию
sysconf
для определения максимального числа дескрипторов и размещения соответствующего массива client
в памяти. Глава 7
Параметры сокетов
7.1. Введение
Существуют различные способы получения и установки параметров сокетов:
функции
getsockopt
и setsockopt
; функция
fcntl
; функция
ioctl
. Эту главу мы начнем с описания функций
getsockopt
и setsockopt
. Далее мы приведем пример, в котором выводятся заданные по умолчанию значения параметров, а затем дадим подробное описание всех параметров сокетов. Мы разделили описание параметров на следующие категории: общие, IPv4, IPv6, TCP и SCTP. При первом прочтении главы можно пропустить подробное описание параметров и при необходимости прочесть отдельные разделы, на которые даны ссылки. Отдельные параметры подробно описываются в дальнейших главах, например параметры многоадресной передачи IPv4 и IPv6 мы обсуждаем в разделе 19.5. Мы также рассмотрим функцию
fcntl
, поскольку она реализует предусмотренные стандартом POSIX возможности отключить для сокета блокировку ввода-вывода, включить управление сигналами, а также установить владельца сокета. Функцию ioctl
мы опишем в главе 17. 7.2. Функции getsockopt и setsockopt
Эти две функции применяются только к сокетам.
#include <sys/socket.h>
int getsockopt(int sockfd, int level, int optname, void * optval, socklen_t * optlen);
int setsockopt(int sockfd, int level, int optname, const void * optval, socklen_t optlen);
Обе функции возвращают 0 в случае успешного завершения, -1 в случае ошибки
Переменная
sockfd
должна ссылаться на открытый дескриптор сокета. Переменная level
определяет, каким кодом должен интерпретироваться параметр: общими программами обработки сокетов или зависящими от протокола программами (например, IPv4, IPv6, TCP или SCTP).
optval
— это указатель на переменную, из которой извлекается новое значение параметра с помощью функции setsockopt
или в которой сохраняется текущее значение параметра с помощью функции getsockopt
. Размер этой переменной задается последним аргументом. Для функции setsockopt
тип этого аргумента — значение, а для функции getsockopt
— « значение-результат». В табл. 7.1 и 7.2 сведены параметры, которые могут запрашиваться функцией
getsockopt
или устанавливаться функцией setsockopt
. В колонке «Тип данных» приводится тип данных того, на что указывает указатель optval
для каждого параметра. Две фигурные скобки мы используем, чтобы обозначить структуру, например linger{}
обозначает 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{} |