Читаем Linux: Полное руководство полностью

Название опцииОписание
SO_DEBUGВключить/выключить (1/0) запись отладочной информации для сокета
SO_BROADCASTВключить/выключить (1/0) отправку широковещательных сообщений
SO_REUSEADDRОпция разрешает/запрещает использование локальных адресов
SO_KEEPALIVEСохраняет неактивные соединения "в живых" путем посылки сообщений. Если данный сокет не отвечает на сообщения, соединение будет разорвано, а процессу, который осуществлял запись в сокет, будет послан сигнал SIGPIPE. Для включения KEEPALIVE нужно установить значение 1, для выключения — 0
SO_SNDBUFУстанавливает размер буфера отправки, значение целого типа
SO_RCVBUFУстанавливает размер буфера приема, значение целого типа
SO_SNDTIMEOУстановка таймаута для отправки сообщений. По умолчанию таймаут равен 0, то есть его вообще нет. Нужно передать значение типа struct timeval
SO_RCVTIMEOУстановка таймаута для приема сообщений. По умолчанию таймаут равен 0, то есть его вообще нет. Нужно передать значение типа struct timeval
TCP_NODELAYОтключить (1) механизм буферизации сообщений, то есть они будут отправляться сразу, без задержки. Для включения механизма буферизации нужно указать значение 0
TCP_MAXSEGУстановить максимальный сегмент данных. Значение целого типа
TCP_NOPUSHНе использовать проталкивание (1)
TCP_NOOPTНе использовать опции TCP (1). Для использования опций передайте значение 0

В случае успешной установки параметра функция setsockopt() возвращает 0; в случае ошибки возвращается -1, а переменная errno устанавливается следующим образом:

♦ EBADF — неверный дескриптор сокета:

♦ ENOTSOCK — указанный дескриптор является файлом, а не сокетом;

♦ EFAULT — нет доступа к адресу, на который указывает указатель optval, то есть данный адрес находится за пределами видимости приложения.

Функция getsockopt() возвращает значение параметра. Кроме вышеперечисленных параметров, функция getsockopt() может использовать следующие параметры:

♦ SO_ERROR — возвращает номер ошибки (будет в возвращаемом значении);

♦ SO_TYPE — возвращает тип сокета.

Рассмотрим небольшой пример работы с опциями сокетов. Мы установим размер буфера TCP.

#include "sock.h"

#include "stdio.h"

main() {

 int sd; /* дескриптор сокета */

 int optval; /* значение опции */

 int optlen; /* длина optval */

 int new_buffsize = 8192; /* новый размер буфера */

 /* создаем сокет */

 sd = socket(AF_INET, SOCK_STREAM, 0);

 /* считывание длины буфера TCP */

 optlen = sizeof(optval);

 getsockopt(sd, SOL_SOCKET, SO_SNDBUF, &optval, &optlen);

 printf("Size of send buffer %d\n", optval);

 getsockopt(sd, SOL_SOCKET, SO_RCVBUF, &optval, &optlen);

 printf("Size of recv buffer %d\n", optval);

 /* изменяем длину буфера */

 setsockopt(sd, SOL_SOCKET, SO_RCVBUF,

  &new_buffsize, sizeof(new_buffsize));

 setsockopt(sd, SOL_SOCKET, SO_SNDBUF,

  &new_buffsize, sizeof(new_buffsize));

 /* выводим измененную информацию */

 getsockopt(sd, SOL_SOCKET, SO_SNDBUF, &optval, &optlen);

Перейти на страницу:

Все книги серии Полное руководство

Похожие книги