Этот сценарий входит в цикл, в котором повторно вызывает метод recv () для чтения ответов, полученных от серверов. Выполнение цикла не завершается до тех пор, пока число полученных ответов не будет равным числу отправленных запросов или же не истечет заранее установленный тайм-аут. После получения каждого ответа клиент выводит имя удаленного хоста и возвращенную им отметку времени. Код данной версии клиента службы времени будет приведен ниже. Проведем анализ программы.
Строки 1—7. Инициализация сценария. Вызывается модуль IO::Socket со своими константами. Снова объявлена константа max_msg_len и определен тайм-аут для получения всех ответов. Как и прежде, разделитель входных записей устанавливается равным crlf.
Строка 8. Установка обработчика сигнала. Для установки допустимого интервала времени, в течение которого могут быть получены ответы, применяется функция alarm(), поэтому устанавливается обработчик сигнала alrm, который просто вызывает функцию die с соответствующим сообщением.
Строка 9. Создание сокета. Вызывается метод IO::Socket::lNET->new() с параметром Proto, равным “udp”, для создания сокета UDP. Поскольку адрес назначения будет указываться в методе send() и не требуется выполнение модулем IO::Socket автоматического подключения с помощью функций connect (), параметры PeerPort или Peer Addr не заданы.
Строка 10. Поиск порта службы времени. Выполняется поиск номера порта для версии UDP службы времени с использованием функции getservbyname ().