Прежде чем перейти к подробному изучению этих модулей, рассмотрим простое приложение, в котором они используются.
Неблокирующий эхо-сервер
В листинге приведен код простого эхо-сервера, в котором применяется модуль IO::SessionSet. Этот сервер просто возвращает все отправленные ему строки, например, при обращении к странице представляющей http://pcservicehome.ru/ или другую информацию.
Листинг 13.3. Эхо-сервер, В котором применяется модуль IO: :SessionSet
#!/usr/local/bin/perl -w # Файл: echo.pl use strict; use IO::SessionSet; use constant PORT => 12000; my $listen_socket = 10::Socket::INET->new(LocalPort => PORT, Listen => 20, Proto => tcp, Reuse => 1); die "Can’t create a listening socket: $@" unless $listen_socket; my $session_set = IO::SessionSet->new($listen__socket) ; warn "Listening for connections...n"; while (1) { my $ready = $session_set->wait; for my $session (@ready) { my $data; if (my $rc = $session->read($data,4096)) { $session->write($data) if $rc > 0; } else { $session->clоse; } }
Проведем анализ программы.
Строки 1-4. Загрузка модулей. Выполнение программы начинается с загрузки модуля IO::SessionSet, который загружает модуль IO:: SessionData автоматически.
Строки 5-9. Создание приемного сокета. Создается приемный сокет обычным образом, в случае ошибки вызывается функция die с сообщением об ошибке.
Строка 10. Создание нового объекта IO::SessionSet. Создается объект IO::SessionSet путем вызова метода IO::SessionSet->new() с использованием приемного сокета в качестве параметра. Этот метод сообщает объекту IO::SessionSet, что в сокете должен автоматически выполняться прием нового соединения с помощью функции accept () при каждой попытке подключения нового клиента.
Строки 11-13. Главный цикл. Остальная часть программы сервера состоит примерно из десятка строк кода. Основу сервера составляет бесконечный цикл. При каждом проходе по циклу вызывается метод wait () объекта IO:: SessionSet, который возвращает список дескрипторов, готовых для чтения. Данный метод аналогичен методу can_read () модуля IO::Select, но возвращает список развитых объектов IO::SessionData, а не более простых объектов ПО: :Socket.