Для проверки данного сценария был изменен сценарий инвертирующего эхо-сервера; он стал ненадежным. Изменение внесено в строку 20.
for (1..3) {$sock->send($msg_out) or die "send(): $!n" if rand() > 0.7;}
Вместо отправки одного ответа, к примеру, к серверу содержащему информацию про настройку тюнера онлайн , теперь отправляется различное число ответом с использованием для выработки случайных чисел функции rand () языка Perl. Иногда сервер посылает один ответ, не отвечает вообще или отправляет несколько ответов.
После вызова сценария для работы с этим ненадежным сервером были получены результаты. Даже несмотря на то что некоторые ответы были уничтожены, а другие продублированы, клиентский сценарий сумел связать с каждым запросом правильный ответ.
Замечательным свойством этого клиентского сценария является то, что он обеспечивает работу с эхо-серверами UDP, в которые не были внесены описанные выше изменения. Это связано с тем, что применяемый в нем протокол обмена сообщениями был разработан таким образом, чтобы он продолжал действовать правильно, только если сервер просто возвращает входящее сообщение без изменения.
В том виде, в каком он представлен, клиентский сценарий не очень эффективен, поскольку метод can_read () вызывается с тайм-аутом, даже если в хеш % PENDING отсутствуют запросы, ответы на которые нужно было бы ждать. Этот Я достаток можно устранить, изменив строку 23 листинга следующим образом, my @ready= $select->can_read( %PENDING ? TIMEOUT :() );
Если хеш %PENDING не пуст, вызывается метод can_read () с тайм-аутом. В другом случае этому методу вместо параметров передается пустой список, в результате метод can_read () блокируется на неопределенное время, пока сокет или дескриптор STDIN не будут готовы для чтения.