UNIX: разработка сетевых приложений
Чтобы получить возможность передавать дескрипторы сокетов, программам, работающим только с одним из протоколов, в стандарте RFC 2133 [37] предлагается использовать параметр сокета
, позволяющий получить или изменить семейство сокета. Однако семантика параметра не была описана полностью, да и использоваться он мог только в очень специфических ситуациях, поэтому в следующей версии интерфейса сокетов данный параметр был отменен.IPV6_ADDRFORM12.6. Резюме
Сервер IPv6 на узле с двойным стеком протоколов может предоставлять сервис как клиентам IPv4, так и клиентам IPv6. Клиент IPv4 посылает серверу дейтаграммы IPv4, но стек протоколов сервера преобразует адрес клиента к виду IPv6, поскольку сервер IPv6 работает со структурами адресов сокетов IPv6.
Аналогично, клиент IPv6 на узле с двойным стеком протоколов может взаимодействовать с сервером IPv4. Распознаватель клиента возвращает адреса IPv4, преобразованные к виду IPv6, для всех записей сервера типа А, и вызов функции connect для одного из этих адресов приводит к тому, что двойной стек посылает сегмент SYN IPv4. Только отдельным специальным клиентам и серверам необходимо знать протокол, используемый собеседником (например, FTP), и чтобы определить, что собеседник использует IPv4, можно использовать макрос
.IN6_IS_ADDR_V4MAPPEDУпражнения
1. Запустите FTP-клиент IPv6 на узле с двойным стеком протоколов. Соединитесь с FTP-сервером IPv4, запустите команду
, а затем командуdebug. Далее выполните те же операции, но для сервера IPv6, и сравните команды PORT, являющиеся результатом выполнения командdir.dir2. Напишите программу, требующую ввода одного аргумента командной строки, который является адресом IPv4 в точечно-десятичной записи. Создайте TCP-сокет IPv4 и свяжите этот адрес и некоторый порт, например 8888, с сокетом при помощи функции
. Вызовите функциюbind, а затемlisten. Напишите аналогичную программу, которая в качестве аргумента командной строки принимает шестнадцатеричную строку IPv6 и создает прослушиваемый TCP-сокет IPv6. Запустите программу IPv4, задав в качестве аргумента универсальный адрес. Затем перейдите в другое окно и запустите программу IPv6, задав в качестве аргумента универсальный адрес IPv6. Можете ли вы запустить программу IPv6, если программа IPv4 уже связана с этим портом? Появляется ли разница при использовании параметра сокетаpause? Что будет, если вы сначала запустите программу IPv6, а затем попытаетесь запустить программу IPv4?SO_REUSEADDRГлава 13
Процессы-демоны и суперсервер inetd
13.1. Введение
Демон (daemon) — это процесс, выполняющийся в фоновом режиме и не связанный с управляющим терминалом. Системы Unix обычно имеют множество процессов (от 20 до 50), которые являются демонами, работают в фоновом режиме и выполняют различные административные задачи.
Независимость от терминала обычно является побочным эффектом запуска из системного сценария инициализации (например, в процессе загрузки компьютера). Если же демон запускается командой интерпретатора, он должен самостоятельно отключиться от терминала во избежание нежелательного взаимодействия с системами управления задачами, сеансами терминалов, а также вывода на терминал при работе в фоновом режиме.
Существует несколько способов запустить демон:
1. Во время запуска системы многие демоны запускаются сценариями инициализации системы. Эти сценарии часто находятся в каталоге
или в каталоге, имя которого начинается с/etc, но их расположение и содержание зависят от реализации. Такие демоны запускаются с правами привилегированного пользователя./etc/rcНекоторые сетевые серверы часто запускаются из сценариев инициализации: суперсервер
(следующий пункт, который мы рассмотрим), веб-сервер и почтовый сервер (обычно это программаinetd). Демонsendmail, обсуждаемый в разделе 13.2, тоже обычно запускается одним из этих сценариев.syslogd2. Многие сетевые серверы запускаются суперсервером
, который мы опишем далее в этой главе. Самinetdзапускается в одном из сценариев на этапе 1. Суперсерверinetdпрослушивает сетевые порты (Telnet, FTP и т.д.), и когда приходит запрос, активизирует требуемый сервер (сервер Telnet, сервер FTP и т.д.).inetd3. За периодические процессы в системе отвечает демон
, и программы, которые он активизирует, выполняются как демоны. Сам демонcronзапускается на этапе 1 во время загрузки системы.cron4. Если программа должна быть выполнена однократно в определенный момент времени в будущем, применяется команда
. Демонatобычно инициирует эти программы, когда приходит время их выполнения, поэтому они выполняются как демоны.cron5. Демоны можно запускать с пользовательских терминалов, как в основном, так и в фоновом режимах. Это часто осуществляется при тестировании демона или перезапуске демона, завершенного по некоей причине.
Поскольку у демона нет управляющего терминала, ему необходимы средства для вывода сообщений о некоторых событиях — это могут быть обычные информационные сообщения или экстренные сообщения об аварийных ситуациях, которые должен обрабатывать администратор. Использование функции
— стандартный способ вывода таких сообщений. Эта функция посылает сообщения демонуsyslog.syslogd13.2. Демон syslogd
Системы Unix обычно запускают демон
в одном из сценариев инициализации системы, и он функционирует, пока система работает. Реализацииsyslogd, происходящие от Беркли, выполняют при запуске следующие действия:syslogd1. Считывается файл конфигурации, обычно
, в котором указано, что делать с каждым типом сообщений, получаемых демоном. Эти сообщения могут добавляться в файл (особой разновидностью такого файла является/etc/syslog.conf, который записывает сообщение на консоль), передаваться определенному пользователю (если этот пользователь вошел в систему) или передаваться демону/dev/consoleна другом узле.syslogd2. Создается доменный сокет Unix и связывается с полным именем
(в некоторых системах/var/run/log)./dev/log3. Создается сокет UDP и связывается с портом 514 (служба
).syslog4. Открывается файл (устройство)
. Любые сообщения об ошибках внутри ядра появляются как входные данные на этом устройстве./dev/klogДемон
выполняется в бесконечном цикле, в котором вызывается функцияsyslogd, ожидающая, когда один из трех его дескрипторов (из п. 2, 3 и 4) станет готов для чтения. Этот демон считывает сообщение и выполняет то, что предписывает делать с этим сообщением файл конфигурации. Если демон получает сигналselect, он заново считывает файл конфигурации.SIGHUP