Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:

6. Почему приложение должно вызывать функцию

shutdown
с аргументом
SHUT_RDWR
, вместо того чтобы просто вызвать функцию
close
?

7. Что происходит в листинге 6.4, когда клиент отправляет RST для завершения соединения?

8. Перепишите код, показанный в листинге 6.5, чтобы вызывать функцию

sysconf
для определения максимального числа дескрипторов и размещения соответствующего массива
client
в памяти.

Глава 7

Параметры сокетов

7.1. Введение

Существуют различные способы получения и установки параметров сокетов:

функции

getsockopt
и
setsockopt
;

функция

fcntl
;

функция

ioctl
.

Эту главу мы начнем с описания функций

getsockopt
и
setsockopt
. Далее мы приведем пример, в котором выводятся заданные по умолчанию значения параметров, а затем дадим подробное описание всех параметров сокетов. Мы разделили описание параметров на следующие категории: общие, IPv4, IPv6, TCP и SCTP. При первом прочтении главы можно пропустить подробное описание параметров и при необходимости прочесть отдельные разделы, на которые даны ссылки. Отдельные параметры подробно описываются в дальнейших главах, например параметры многоадресной передачи IPv4 и IPv6 мы обсуждаем в разделе 19.5.

Мы также рассмотрим функцию

fcntl
, поскольку она реализует предусмотренные стандартом POSIX возможности отключить для сокета блокировку ввода-вывода, включить управление сигналами, а также установить владельца сокета. Функцию
ioctl
мы опишем в главе 17.

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

  • Читать дальше
  • 1
  • ...
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку:

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{}