Одна из сопутствующих проблем API сокетов в том, что установка пары сокетов выполняется с помощью двух вызовов функций (bind и connect) вместо одного. В [122] предлагается одиночная функция, разрешающая эту проблему:
int bind_connect_listen(int
const struct sockaddr *
const struct sockaddr *
int
Аргумент laddr задает локальный IP-адрес и локальный порт, аргумент faddr — удаленный IP-адрес и удаленный порт, аргумент listen задает клиент (0) или сервер (значение ненулевое; то же, что и аргумент backlog функции listen). В таком случае функция bind могла бы быть библиотечной функцией, вызывающей эту функцию с пустым указателем faddr и нулевым faddrlen, а функция connect — библиотечной функцией, вызывающей эту функцию с пустым указателем laddr и нулевым laddrlen. Существует несколько приложений, особенно FTP, которым необходимо задавать и локальную пару, и удаленную пару, которые могут вызывать bind_connect_listen непосредственно. При наличии подобной функции отпадает необходимость в параметре SO_REUSEADDR, в отличие от серверов UDP, которым явно необходимо допускать полностью дублированное связывание с одним и тем же IP-адресом и портом. Другое преимущество этой новой функции в том, что сервер TCP может ограничить себя обслуживанием запросов на соединения, приходящих от одного определенного IP-адреса и порта. Это определяется в RFC 793 [96], но невозможно с существующими API сокетов.
Параметр сокета SO_TYPE
Этот параметр возвращает тип сокета. Возвращаемое целое число — константа
SOCK_STREAM
или
SOCK_DGRAM
. Этот параметр обычно используется процессом, наследующим сокет при запуске.
Параметр сокета SO_USELOOPBACK
Этот параметр применяется только к маршрутизирующим сокетам (
AF_ROUTE
). По умолчанию он включен на этих сокетах (единственный из параметров
SO_
, по умолчанию включенный). В этом случае сокет получает копию всего, что отправляется на сокет.
Другой способ отключить получение этих копий — вызвать функцию shutdown со вторым аргументом SHUT_RD.
7.6. Параметры сокетов IPv4
Эти параметры сокетов обрабатываются IPv4 и для них аргумент
level
равен
IPPROTO_IP
. Обсуждение пяти параметров сокетов многоадресной передачи мы отложим до раздела 19.5.
Параметр сокета IP_HRDINCL
Если этот параметр задан для символьного сокета IP (см. главу 28), нам следует создать наш собственный заголовок IP для всех дейтаграмм, которые мы отправляем через символьный сокет. Обычно ядро создает заголовок IP для дейтаграмм, отправляемых через символьный сокет, но существует ряд приложений (в частности,
traceroute
), создающих свой собственный заголовок IP, заменяющий значения, которые IP поместил бы в определенные поля заголовка.
Когда установлен этот параметр, мы создаем полный заголовок IP со следующими исключениями:
IP всегда сам вычисляет и записывает контрольную сумму заголовка IP.
Если мы устанавливаем поле идентификации IP в 0, ядро устанавливает это поле самостоятельно.
Если IP-адрес отправителя (source address) —
INADDR_ANY
, IP устанавливает его равным основному IP-адресу исходящего интерфейса.