27.3.9. Установка опций сокета
27.3.9. Установка опций сокета
Поскольку мы используем набор протоколов AF_INET, то в этом пункте будем рассматривать только те опции сокетов, которые относятся к этому набору. Для работы с опциями сокета используются две функции:
? getsockopt() — получение опций сокета;
? setsockopt() — установка опций сокета.
Прототипы этих функций выглядят так:
#include <sys/socket.h>
int getsockopt(int sd, int level, int option_name,
void *restrict option_value, socklen_t *restrict option_len);
int setsockopt(int sd, int level, int option_name,
const void *option_value, socklen_t option_len);
Первый параметр, sd, — это дескриптор сокета. Второй параметр — уровень доступа (существует только один уровень — SOL_SOCKET). Следующий параметр, option_name, — это название опции, значение которой вы хотите изменить (см. таблицу 27.10). Последние два параметра — это значение опции и его размер.
Наиболее часто используемые опции сокетов Таблица 27.10
Название опции Описание 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 ", optval);
getsockopt(sd, SOL_SOCKET, SO_RCVBUF, &optval, &optlen);
printf("Size of recv buffer %d ", 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);
printf("New size of send buffer %d ", optval);
getsockopt(sd, SOL_SOCKET, SO_RCVBUF, &optval, &optlen);
printf("New size of recv buffer %d ", optval);
}
Данный текст является ознакомительным фрагментом.