Поскольку перед отправкой широковещательной дейтаграммы приложение должно установить этот параметр сокета, оно не сможет отправить широковещательное сообщение, если это не предполагалось заранее. Например, приложение UDP может принять IP-адрес получателя в качестве аргумента командной строки, но оно может и не предполагать, что пользователь вводит широковещательный адрес. Проверку того, является ли данный адрес широковещательным, осуществляет не приложение, а ядро: если адрес получателя является широковещательным адресом и данный параметр сокета не установлен, возвратится ошибка
EACCESS
[128, с. 233].
Параметр сокета SO_DEBUG
Этот параметр поддерживается только протоколом TCP. При подключении к сокету TCP ядро отслеживает подробную информацию обо всех пакетах, отправленных или полученных протоколом TCP для сокета. Они хранятся в кольцевом буфере внутри ядра, который можно проверить с помощью программы
trpt
. В [128, с. 916-920] приводится более подробная информация и пример использования этого параметра.
Параметр сокета SO_DONTROUTE
Этот параметр указывает, что исходящие пакеты должны миновать обычные механизмы маршрутизации соответствующего протокола. Например, в IPv4 пакет направляется на соответствующий локальный интерфейс, который задается адресом получателя, а именно сетевым адресом и маской подсети. Если локальный интерфейс не может быть определен по адресу получателя (например, получателем не является другой конец соединения типа «точка-точка» или он не находится в той же сети), возвращается ошибка
ENETUNREACH
.
Эквивалент этого параметра можно также применять к индивидуальным дейтаграммам, используя флаг
MSG_DONTROUTE
с функциями
send
,
sendto
или
sendmsg
.
Этот параметр часто используется демонами маршрутизации (
routed
и
gated
) для того, чтобы миновать таблицу маршрутизации (в случае, если таблица маршрутизации неверна) и заставить пакет отправиться на определенный интерфейс.
Параметр сокета SO_ERROR
Когда на сокете происходит ошибка, модуль протокола в ядре, происходящем от Беркли, присваивает переменной
so_error
для этого сокета одно из стандартных значений Unix
E
. Это так называемая
1. Если процесс блокируется в вызове функции
select
(см. раздел 6.3), ожидая готовности данного сокета к чтению или записи, функция
select
возвращает управление и уведомляет процесс о соответствующем состоянии готовности.
2. Если процесс использует управляемый сигналом ввод-вывод (см. главу 25), для него или для группы таких процессов генерируется сигнал
SIGIO
.
Процесс может получить значение переменной
so_error
, указав параметр сокета
SO_ERROR
. Целое значение, возвращаемое функцией
getsockopt
, является кодом ошибки, требующей обработки. Затем значение переменной
so_error
сбрасывается ядром в 0 [128, с. 547].
Если процесс вызывает функцию
read
и возвращаемых данных нет, а значение
so_error
ненулевое, то функция
read
возвращает -1 с
errno
, которой присвоено значение переменной
so_error
[128, с. 516]. Это значение
so_error
затем сбрасывается в 0. Если в очереди для сокета есть данные, эти данные возвращаются функцией
read
вместо кода ошибки. Если значение
so_error
ненулевое, то при вызове процессом функции
write
возвращается -1 с
errno
, равной значению переменной
so_error
[128, с. 495], а значение
so_error
сбрасывается в 0.
В коде, показанном на с. 495 [128], есть ошибка: so_error не сбрасывается в 0. Она была выявлена в реализации BSD/OS. Всегда, когда для сокета возвращается ошибка, требующая обработки, so_error должна быть сброшена в 0.
Здесь вы впервые встречаетесь с параметром сокета, который можно получить, но нельзя установить.
Параметр сокета SO_KEEPALIVE
Когда параметр
SO_KEEPALIVE
установлен для сокета TCP и в течение двух часов не происходит обмена данными по сокету в любом направлении, TCP автоматически посылает собеседнику проверочное сообщение (keepalive probe). Это сообщение — сегмент TCP, на который собеседник должен ответить. Далее события могут развиваться по одному из трех сценариев.
1. Собеседник отвечает, присылая ожидаемый сегмент ACK. Приложение не получает уведомления (поскольку все в порядке). TCP снова отправит одно проверочное сообщение еще через два часа отсутствия активности в этом соединении.