UNIX: разработка сетевых приложений
Шрифт:
Изменений
Обратите внимание, что мы проверяем argc и выводим соответствующее сообщение до вызова
Если мы запустим эту программу на нашем узле
Дата, время и имя узла автоматически ставятся в начале сообщения демоном
13.5. Демон inetd
В типичной системе Unix может существовать много серверов, ожидающих запроса клиента. Примерами являются FTP, Telnet, Rlogin, TFTP и т.д. В системах, предшествующих 4.3BSD, каждая из этих служб имела связанный с ней процесс. Этот процесс запускался во время загрузки из файла
1. Все демоны содержали практически идентичный код запуска, направленный сначала на создание сокета, а затем на превращение процесса в процесс демона (аналогично нашей функции
2. Каждый демон занимал некоторое место в таблице процессов, но при этом большую часть времени находился в состоянии ожидания.
Реализация 4.3BSD упростила ситуацию, предоставив суперсервер( superserver) Интернета — демон
1. Он упрощает написание процессов демонов, поскольку обрабатывает большинство подробностей запуска. Таким образом устраняется необходимость вызова нашей функции
2. Этот демон позволяет одиночному процессу (
Процесс
Действительное имя сервера всегда передается в качестве первого аргумента программе, выполняемой с помощью функции
Таблица 13.4. Поля файла inetd.conf
Поле | Описание |
---|---|
service-name | Должен быть в /etc/services |
socket-type | stream (TCP) или dgram (UDP) |
Protocol | Должен быть в /etc/protocols; либо tcp, либо udp |
wait-flag | Обычно nowait для TCP и wait для UDP |
login-name | Из /etc/password; обычно root |
server-program | Полное имя программы для вызова exec |
server-program-arguments | Аргументы программы для вызова exec |
Таблица и приведенные строки — это только пример. Большинство производителей добавили демону inetd свои собственные функции. Примером может служить возможность обрабатывать серверы вызовов удаленных процедур (RPC) в дополнение к серверам TCP и UDP, а также возможность обрабатывать другие протоколы, отличные от TCP и UDP. Полное имя для функции exec и аргументы командной строки сервера, очевидно, зависят от приложения.
Флаг wait-flag может быть достаточно труден для понимания. Он указывает, собирается ли демон, запускаемый inetd, взять на себя работу с прослушиваемым сокетом. Сервисы UDP лишены деления на прослушиваемые и принятые сокеты, и потому практически всегда создаются с флагом wait-flag, равным wait. Сервисы TCP могут вести себя по-разному, но чаще всего для них указывается флаг wait-flag со значением nowait.
Взаимодействие IPv6 с файлом /etc/inetd.conf зависит от производителя. Иногда в качестве поля protocol указывается tcp6 или udp6, чтобы подчеркнуть, что для сервера должен быть создан сокет IPv6. Некоторые разрешают использовать значения protocol, равные tcp46 и udp46, если сервер готов принимать соединения по обоим протоколам. Специальные названия протоколов обычно не включаются в файл /etc/protocols.