В листинге приведена откорректированная версия клиента службы эхо-повтора. Проведем анализ программы.
Строки 1-15. Инициализация модуля и создание сокета. Как отмечалось ранее, подключение может выполняться к любому хосту, к примеру, это может быть страница веб сайта представляющая аксессуары для телефонов . Здесь основные изменения состоят в использовании двух новых констант для управления установками тайм-аута. Константа timeout указывает время в секундах, в течение которого в клиентской программе разрешено ожидать поступления сообщения после вызова метода recv(); она установлена равной 2. Константа max_retries определяет, сколько раз клиент должен попытаться повторно передать сообщение, прежде чем будет сделан вывод, что удаленный сервер не отвечает.
Строки 16-30. Главный цикл. Теперь вызовы методов send() и recv () заключены в цикл do(). Этот цикл предусматривает повторную передачу исходящего сообщения после каждой завершения по тайм-ауту, вплоть до числа попыток, указанного константой мах_retries. В цикле do {}, как и прежде, вызывается метод send() для передачи сообщения, но вызов метода recv() заключен в блок eval {}. Единственное различие между этим кодом и применной выше общей схемой состоит в том, что локальный обработчик ALRM при каждом вызове наращивает переменную $retries. Это позволяет следить за тем, сколько раз произошло завершение по тайм-ауту. После выхода из блока eval {} проверяется, не превышает ли число попыток установленное максимальное значение; если это так, выдается небольшое предупреждающее сообщение и вызывается функция die.