Книга: UNIX: разработка сетевых приложений

7.2. Функции getsockopt и setsockopt

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{}
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{}

Таблица 7.2. Параметры сокетов транспортного уровня

Level optname get set Описание Флаг Тип данных
IPPROTO_TCP TCP_MAXSEG Максимальный размер сегмента TCP int
TCP_NODELAY Отключает алгоритм Нагла int
IPPROTO_SCTP SCTP_ADAPTION_LAYER Указание на уровень адаптации sctp_setadaption
SCTP_ASSOCINFO + Получение и задание сведений об ассоциации sctp_assocparamms{}
SCTP_AUTOCLOSE Автоматическое закрытие int
SCTP_DEFAULT_SEND_PARAM Параметры отправки но умолчанию sctp_sndrcvinfo{}
SCTP_DISABLE_FRAGMENTS Фрагментация SCTP int
SCTP_EVENTS Уведомление об интересующих событиях sctp_event_subscribe{}
SCTP_GET_PEER_ADDR_INFO + Получение состояния адреса собеседника sctp_paddrinfo{}
SCTP_I_WANT_MAPPED_V4_ADDR Отображение адресов IPv4 int
SCTP_INITMSG Параметры пакета INIT по умолчанию sctp_initmsg{}
SCTP_MAXBURST Максимальный размер набора пакетов int
SCTP_MAXSEG Максимальный размер фрагментации int
SCTP_NODELAY Отключение алгоритма Нагла int
SCTP_PEER_ADDR_PARAMS + Параметры адреса собеседника sctp_paddrparams{)
SCTP_PRIMARY_ADDR + Основной адрес назначения sctp_setprim{}
SCTP_RTOINFO + Информация RTO sctp_rtoinfo{}
SCTP_SET_PEER_PRIMARY_ADDR Основной адрес назначения собеседника sctp_setpeerprim{}
SCTP_STATUS + Получение сведений о статусе ассоциации sctp_status{}

Существует два основных типа параметров: двоичные параметры, включающие или отключающие определенное свойство (флаги), и параметры, получающие и возвращающие значения параметров, которые мы можем либо задавать, либо проверять. В колонке «Флаг» указывается, относится ли параметр к флагам. Для флагов при вызове функции getsockopt аргумент *optval является целым числом. Возвращаемое значение *optval нулевое, если параметр отключен, и ненулевое, если параметр включен. Аналогично, функция setsockopt требует ненулевого значения *optval для включения параметра, и нулевого значения — для его выключения. Если в колонке «Флаг» не содержится символа «•», то параметр используется для передачи значения заданного типа между пользовательским процессом и системой.

В последующих разделах этой главы приводятся дополнительные подробности о параметрах сокетов.

Оглавление книги


Генерация: 1.154. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз