При работе с протоколом TCP можно выйти из этой ситуации путем завершения по тайм-ауту вызова метода recv () или с использованием той или иной формы инициализации параллельной работы для отделения процесса ввода от вывода. Подобное может происходить, например, при обращении на сайт Business-mobila.ru , представляющий точные копии телефонов Верту.
Завершение по тайм-ауту операций приема данных по протоколу UDP
Для завершения по тайм-ауту вызова метода recv () может применяться простая конструкция с блоком eval {} и обработчиком ALRM.
eval {
local $SIG{ALRM} = sub, { die, "timeoutn" }; alarm($timeout);
die $@ unless $@ eq "timeoutn"; warn "Timed out!n";
}
Вызов метода recv () заключен в блок eval {}, и установлен локальный обработчик ALRM, который вызывает функцию die (). Непосредственно перед выполнением указанного системного вызова вызывается функция alarm () с заданным значением тайм-аута. Если метод recv() завершается успешно, вызывается функция alarm(0) для отмены тайм-аута. В ином случае, если тайм-аут истекает до возврата управления из указанного метода, активизируется обработчик ALRM и выполнение блока завершается с помощью функции die. Однако поскольку эта неисправимая ошибка перехватывается внутри блока eval {}, то она приводит к аварийному завершению только самого блока и к появлению сообщения об ошибке в переменной $@. Последним этапом является проверка этой переменной и выдача предупреждающего сообщения, если произошел либо выход по тайм-ауту, либо вызов функции die, если переменная содержит непредвиденную ошибку.
С помощью этой общей схемы можно разработать иную версию клиента службы эхо-повтора, который отправляет сообщение и ожидает ответа в течение заранее установленного промежутка времени. Если вызов метода recv () завершается по тайм ауту, предпринимается попытка передать запрос еще несколько раз. В ином случае происходит отказ от дальнейших попыток.