Книга: 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
для включения параметра, и нулевого значения — для его выключения. Если в колонке «Флаг» не содержится символа «•», то параметр используется для передачи значения заданного типа между пользовательским процессом и системой.
В последующих разделах этой главы приводятся дополнительные подробности о параметрах сокетов.
- 7.1. Введение
- 7.2. Функции getsockopt и setsockopt
- 7.3. Проверка наличия параметра и получение значения по умолчанию
- 7.4. Состояния сокетов
- 7.5. Общие параметры сокетов
- 7.6. Параметры сокетов IPv4
- 7.7. Параметр сокета ICMPv6
- 7.8. Параметры сокетов IPv6
- 7.9. Параметры сокетов TCP
- 7.10. Параметры сокетов SCTP
- 7.11. Функция fcntl
- 7.12. Резюме
- Упражнения
- Аргументы функции в Python
- 3. Функции
- Новые функции API для работы с Blob и массивами
- Математические функции
- Размытые функции
- 7.3. Финансовые функции
- 4.3. Логические функции и таблицы истинности
- B1.7. Функции обработки ошибок
- 9.1.4.2. Функции-оболочки: execl() и др.
- 11.5. Функции getservbyname и getservbyport
- Функции dup(2) и dup2(2)
- Применение функции scanf( )