В методе wait () предусмотрены все необходимые действия для обслуживания приемного сокета. Если обнаружено входящее соединение, например, получение данных веб страницы , представляющей роутеры MikroTik, то метод wait () вызывает метод accept () приемного сокета, преобразует возвращенный подключенный сокет в новый объект IO::SessionData и добавляет объект к своему списку контролируемых сокетов. Затем этот новый объект сеанса возвращается вызывающей процедуре наряду со всеми прочими объектами IO::SessionData, готовыми к вводу-выводу.
Метод wait ( ) предусматривает также завершение неполных операций записи, которые могли произойти в течение предыдущих проходов по циклу. Если в настоящее время ни один сеанс не готов для чтения, метод wait () блокируется на неопределенное время.
Строки 14-21. Обслуживание сеансов. Теперь выполняется цикл по всем объектам SessionData, возвращенным методом wait (), и каждый объект обслуживается по очереди. Для каждого объекта сеанса вызывается метод read (), который возвращает вплоть до 4 Кбайт данных в локальную переменную. Если метод read() возвращает истинное значение, эти данные немедленно передаются в метод write() сеанса, что приводит к их отправке клиенту.
Если метод read( ) возвращает ложное значение, это рассматривается как признак конца файла. Сеанс закрывается путем вызова метода close () и выполнение цикла продолжается.
Хотя метод IO::SessionData->read () во многом подобен методу IO::Socket->read (), между ними есть очень важное различие. Метод модуля IO::Socket возвращает либо число считанных байтов, либо значение undef (при неудачном завершении), тогда как метод IO::SessionData->read (), как и метод getline ( ) модуля Getline, может также возвращать значение 0Е0, если операция чтения была бы заблокирована.
В главном цикле программы, приведенной в листинге выше, вначале проверяется код результата в логическом операторе if (). В этом контексте код результата EWOULDBLOCK рассматривается как истинное значение, сообщающее о том, что ошибки не возникали. Затем перед вызовом метода write () этот код результата трактуется как число байтов и выполняется проверка того, имеет ли он значение больше нуля.