Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > Обработка timeout при работе по telnet


Автор: dron000 13.11.2009, 11:54
Коннекчусь по telnet к серверу, иногда получается ситуация когда срабатывает таймаут, на строке $line = $obj->getline();
Код

$obj = new Net::Telnet (Timeout =>10, 
                                       Host => "99.99.99.99",  
                                       Port       => "9999",
                                       Errmode => "die" );
$obj->print('command.....');
$line = $obj->getline();


как правильно обработать такую ситуацию смотрел тут http://www.opennet.ru/base/dev/perl_net_telnet.txt.html но не очень понял как работает  $boolean = $obj->timed_out; почму-то он всегда true и при успешном подключении. smile 

Автор: Bulat 13.11.2009, 12:49
Цитата(dron000 @  13.11.2009,  11:54 Найти цитируемый пост)
Коннекчусь по telnet к серверу, иногда получается ситуация когда срабатывает таймаут, на строке $line = $obj->getline();


не читал документацию по ссылке, но предполагаю, что таймаут срабатывает, если метод ничего не моэет вернуть в течении 10 секунд, явно объявленных в строке

Код

$obj = new Net::Telnet (Timeout =>10, ...


не совсем понятно чего вы хотите добиться, чтобы таймаута вообще не было?? Наверно это не реализовано, но при желании вместо 10 секунд, можно его увеличить  smile

Автор: dron000 13.11.2009, 14:18
Про то что он есть и как его увеличить я догадываюсь....Мне нужно чтобы на страницу выводилось сообщение об ошибке.

Автор: dron000 15.11.2009, 00:58
Есть какие-то варианты как обработать ситуацию когда сервак определенное время не отвечает и выдать сообщение об ошибке, не останавливая программу?

Автор: shamber 15.11.2009, 01:18
dron000, eval?

Автор: dron000 15.11.2009, 01:28
Да не, немного не то нужно- просто померить время задержки ответа сервера при 

Код

$obj = new Net::Telnet (Timeout =>10, 
                                       Host => "99.99.99.99",  
                                       Port       => "9999",
                                       Errmode => "die" );



и вывести сообщение об ошибке, просто если Errmode => "die" то как я понимаю выполнение скрипта завершиться и все.

Автор: Bulat 16.11.2009, 13:16
dron000, 

Код

errmode - определяет действие, предпринимаемое в случае ошибки


       $mode = $obj->errmode;
       $prev = $obj->errmode($mode);


   Метод получает или устанавливает действие, используемое когда
   происходит ошибка использования объекта. Первый вызов возвращает
   текущую моду. Второй - устанавливает значение $mode и возвращает
   предыдущую моду. Правильные значения для $mode - die (по умолчанию),
   return, coderef, или arrayref.

   Когда мода установлена die и происходит ошибка, на печатается ошибка и
   программа завершается

   Если мода установлена coderef, то когда происходит ошибка вызывается
   coderef c ошибкой, как первый аргумент. Используя эту моду вы можете
   создавать вашу собственную обработку ошибок. Если coderef возвращает
   сам себя, то метод сгенерировавший ошибку возвращает неопределенное
   значение или нулевой лист(массив) в зависимости от контекста.

   Если мода установлена arrayref, то первый элемент массива(array)
   должен быть coderef. Любой следующий элемент - аргумент к coderef.
   Когда достигнута ошибка, вызывается coderef его аргументами. Используя
   эту моду вы можете создавать вашу собственную обработку ошибок. Если
   coderef возвращает сам себя, то метод сгенерировавший ошибку
   возвращает неопределенное значение или нулевой лист(массив) в
   зависимости от контекста.


Товарищ!!! Не ленись курить маны.. это все по твоей же ссылке. smile Ну  а вот если будут конкретные проблемы с конкретной реализацией - милости просим  smile 

Автор: dron000 17.11.2009, 15:45
Мне вот как раз и не понятно было как выставляется обработчик, но уже разобрался.Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)