== Сетевые сервисы == На прикладном уровне стека TCP/IP существует множество разнообразных протоколов, например протокол обмена почтой SMTP или протокол обмена файлами FTP. Общая схема работы сетевой программы-сервера, реализующего один из этих протоколов, следующая: она принимает данные, передаваемые программой-клиентом на определенный порт TCP или UDP, обрабатывает их, и отправляет ответ клиенту. Запросы и ответы протокола прикладного уровня часто являются командами в виде обычного текста. Операционная система предоставляет специальный инструмент для создания серверов такого типа. Этот инструмент --- механизм сокетов. Сокеты предоставляют интерфейс синхронного и асинхронного обмена данными. В случае синхронного, или блокирующего, обмена в случае отсутствия данных для чтения при чтении из сокета программа будет ждать, пока эти данные появятся; в случае асинхронного, или неблокирующего, взаимодействия, программа продолжит работу. Сокеты в UNIX-системах могут иметь различное физическое представление. Кроме сетевых сокетов, которые могут передавать данные с одного компьютера на другой, существуют и локальные сокеты Unix, находящиеся в файловой системе. Интерфейс работы с обоими видами сокетов одинаков, за исключением создания сокета. Сетевые сокеты являются низкоуровневым программным интерфейсом к транспортному уровню сетевого взаимодействия в лице протокола TCP или UDP. Работающие на машине с ПСПО программы, передающие данные по сети, используют для доступа к сети именно механизм сокетов. Однако, существует способ создания простых сетевых сервисов, не требующий изучения программирования сокетов. Он напоминает объединение команд в конвейер, с тем отличием, что ввод-вывод должен производиться асинхронно. Стандартные же программы окружения Unix являются "фильтрами", которые преобразовывают ввод и выдают результат на вывод синхронно. Для решения это проблемы существует сетевой супер-сервер {{{xinetd}}}, а ранее эту же задачу решал сервер {{{inetd}}}. Сам он не реализует сетевого сервиса, но дает возможность сделать из программы, которая работает с синхронным вводом-выводом, сетевой сервис, который принимает данные по сети и передает их обратно в сеть. Попробуем создать с помощью {{{xinetd}}} сетевую службу, которая будет выдавать текущую дату. Для этого создадим файл с полным именем {{{/etc/xinetd.d/test}}} и со следующим содержанием: {{{ service test { disable = no type = UNLISTED socket_type = stream protocol = tcp port = 10000 wait = no user = nobody server = /bin/date } }}} Эта запись означает, что создаваемый сервер будет принимать TCP-соединения на порт 10000 и передавать принятую информацию команде {{{/bin/date}}}, которая игнорирует ввод и выдает текущую дату. Запускаться эта команда будет от имени пользователя {{{nobody}}}. Теперь перезапустим сервер `xinetd`: {{{ # service xinetd restart Service xinetd is not running. [PASSED] Staring xinetd service: [ DONE ] }}} Проверим работоспособность сервиса, подключившись к нему командой {{{netcat localhost 10000}}}: {{{ $ netcat localhost 10000 Fri Jul 4 04:31:17 MSD 2008 }}} А если мы укажем в поле {{{server}}} команду {{{/bin/cat}}}, то наш сервер будет отправлять полученные данные обратно отправителю (эхо-сервер). В системе ALT Linux и ПСПО по умолчанию все встроенные службы супер-сервера {{{xinetd}}} выключены. Кроме того, по умолчанию в файле {{{/etc/xinetd.conf}}} указано, что к службам {{{xinetd}}} можно подключаться только с локальной машины, но не с другого компьютера по сети: {{{only_from = 127.0.0.1}}}. После любых изменениях в файле {{{/etc/xinetd.conf}}} и в файлах каталога {{{/etc/xinetd.d}}} супер-сервер следует перезапустить. ---- === Сведения о ресурсах === ## ВНИМАНИЕ! Поля значащие, просьба редактироать только числа и списки модулей ## Требования к знаниям слушателя — имена модулей через пробел; если нет — пустая ячейка ## Ментейнеры прописываются в сответствии с PspoTasks || Готовность (%) || Продолжительность (ак. ч.) || Подготовка (календ. ч.) || Полный текст (раб. д.) || Предварительные знания || Level || Maintainer || Start date || End date || || 90 || 1 || 1 || 1 || || 1 || MaximByshevskiKonopko, VladimirLysikov, VsevolodKrishchenko || || ||