GETSOCKOPT(2)

ИМЯ
getsockopt, setsockopt - получить или установить флаги сокета

ОБЗОР
#include <sys/types.h>          /* Смотрите ЗАМЕЧАНИЯ */
#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);

ОПИСАНИЕ
getsockopt() и setsockopt() управляют параметрами сокета, на который указывает файловый дескриптор sockfd. Параметры могут быть из различных уровней протоколов; они всегда присутствуют на самом верхнем уровне сокета. При работе с параметрами сокета должен быть указан уровень, на котором находится этот параметр и его имя. Для работы с параметрами на уровне API сокета в level указывается значение SOL_SOCKET. Для работы с параметрами на любом другом уровне, этим вызовам передаётся номер соответствующего протокола, который они контролируют. Например, для указания, что параметр должен интерпретироваться протоколом TCP, в level нужно указать номер протокола TCP; смотрите getprotoent(3). Аргументы optval и optlen используются в setsockopt() для доступа к значениям параметров. Для getsockopt() они задают буфер, в который нужно поместить запрошенное значение параметра при возврате. У getsockopt() в аргументе optlen изначально содержится размер буфера, на который указывает optval, а при завершении в нём содержится реальный размер возвращаемого значения. Если значение параметра не указывается или возвращается, то optval может быть NULL. Аргумент optname и все указанные параметры без изменений передаются для интерпретации соответствующему модулю протоколов. Файл <sys/socket.h> содержит определения параметров уровня сокета; их описание дано ниже. Параметры на других уровнях протоколов различаются по формату и по имени. Обращайтесь к соответствующим файлам раздела 4 справочных страниц. Большинство параметров уровня сокета используют тип int для аргумента optval. Чтобы установить параметр логического типа аргумент setsockopt() должен быть ненулевым, и ноль, если нужно отключить этот параметр.

Описание доступных параметров сокетов находится в socket(7) и соответствующих протоколам справочных страницах.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении при стандартных параметрах возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение. Netfilter позволяет программисту определять собственные параметры сокетов со привязанными обработчиками; для таких параметров при успешном выполнении возвращается значение, полученное от обработчика.

ОШИБКИ

EBADF
    Аргумент sockfd не является допустимым файловым дескриптором.

EFAULT
    Адрес, на который указывает optval, не находится в разрешённой части адресного пространства процесса. Для getsockopt() эта ошибка может также появиться, если optlen выходит за пределы адресного пространства процесса.

EINVAL
    Неправильное значение optlen в setsockopt(). В некоторых случаях эта ошибка может возникать из-за неправильного значения в optval (например, для параметра IP_ADD_MEMBERSHIP, описанного в ip(7)).

ENOPROTOOPT
    Неизвестный параметр для указанного уровня.

ENOTSOCK
    Файловый дескриптор sockfd указывает не на каталог.

СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD (данные системные вызовы впервые появились в 4.2BSD).

ЗАМЕЧАНИЯ
В POSIX.1 не требуется включение <sys/types.h>, и этот заголовочный файл не требуется в Linux. Однако, для некоторых старых реализаций (BSD) требует данный файл, и в переносимых приложениях для предосторожности, вероятно, лучше его указать. Аргумент optlen в getsockopt() и setsockopt() в действительности имеет тип int [*] (это именно так в 4.x BSD, libc4 и libc5). При разработке стандарта POSIX случилось некоторое недопонимание и появился тип socklen_t, также используемый в glibc. Смотрите также accept(2).

ДЕФЕКТЫ
Некоторые параметры сокетов должны обрабатываться на более низких уровнях системы.

СМОТРИТЕ ТАКЖЕ
ioctl(2), socket(2), getprotoent(3), protocols(5), ip(7), packet(7), socket(7), tcp(7), udp(7), unix(7)