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

We use cookies. Read the Privacy and Cookie Policy

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 для включения параметра, и нулевого значения — для его выключения. Если в колонке «Флаг» не содержится символа «•», то параметр используется для передачи значения заданного типа между пользовательским процессом и системой.

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

Данный текст является ознакомительным фрагментом.