В серверных приложениях полное имя сокета другого участника соединении вполне может применяться как одна из форм проверки подлинности пользователи. Перед обслуживанием запроса в серверном приложении, к примеру, работающего с контентом мобильной рекламы http://admobispy.com/ можно определить полное имя сокета другого участника соединения и отказаться от обслуживания запроса, если файл сокета не принадлежит конкретному пользователю или группе если не был создан в конкретном каталоге, к которому имеет доступ только определенный пользойтель или группа.
Сервер форматирования текста
В качестве примера приложения используется стандартный модуль Text::Wrap для создания простого сервера форматирования текста. Сервер принимает на вход фрагмент текста, переформатирует его в виде небольших абзацев шириной 30 символов и возвращает его клиенту. В сервере wrap_serv.pl применяется стандартная архитектура ветвления и библиотека IO::Socket::UNIX. В клиенте wrap_cli.pl иcпользуется простой проект, который предусматривает отправку всего входного файла на сервер, закрытие сокета для записи, а затем чтение возвращенных переформатированных данных. Сценарий wrap_serv.pl будет приведен в листинге далее. В этом сценарии применяет конструкция с ветвлением, знакомая по предыдущим примерам. В целях упрощения в этом сервере не применяется автоматический перевод в фоновый режим, запись файла PID и прочие возможности, описанные ранее, но все эти средства несложно добавить с помощью модуля Daemon, который рассматривался недавно. Проведем анализ программы.
Строки 1-4. Импортирование модулей. Загружается модуль IO::Socket и импортируется подпрограмма fill () из модуля Text::Wrap. Поскольку это — сервер с ветвлением, импортируется константа wnohang из модуля posix для использования в обработчике chld. Загружается также набор констант signal_h модуля posix для блокирования и разблокирования сигналов. Это средство будет применяться при вызове функции fork ().
Строки 5-8. Определение констант. Определяется константа sock_path, содержащая полное имя сокета домена UNIX, и различные установки формата, которые должны быть переданы модулю Text::Wrap.