@Konkase

Почему иногда приходят битые данные через Net::Telnet в perl ?

Есть скриптик. Открывает сессию с сервером, отправляет команды, в ответ получает вывод данных команд, кое что парсит и получает количество строк.

perl ./test.pl all 192.168.0.1 23 001,002,003

состав команды зависит от количества последнего аргумента, в котором данные разделены запятой, каждый блок перед запятой - отдельная команда. в данном случае отправится 3 команды телнет серверу.

stat #001001000
stat #001002000
stat #001003000


Дело в том, что ответ от выполнения этих команда приходит не всегда целиком. иногда приходит только половина вывода от любой из команд. Не могу понять причину такого беспорядка :) Будьте добры, подскажите как это отъдебажить?
Смотрел лог перла, команды отправляются целиком, но вот получает иногда только половину, но не всегда. примерно 2 раза из 10 приходят битые ответы. Потерь до сервера нет. если реализовывать с помощью bash и netcat, то 100% верные ответы всегда приходят. Но данный вариант не подходит, необходимо именно Net::Perl.

Сам скрипт:
#!/usr/bin/perl
use Net::Telnet;
use Switch;

$type = $ARGV[0];
$ipats = $ARGV[1];
$port = $ARGV[2];
$stream = $ARGV[3];
@streams = split(',', $stream);

switch($type){
	case "one" 			{	$reg="one";					}
	case "two" 			{	$reg="two";					}
	case "three" 		{	$reg="three";				}
	case "other" 		{	$reg="one|two|three";		}
	case "all" 			{	$reg=".*";					}	
}

$swi = new Net::Telnet (Host => $ipats ,Port => $port , Timeout => 20, Prompt => '/>$/'); 
foreach $str (@streams) {
	chomp $str;
	@output = $swi->cmd(String   => 'stat #001'.$str.'000');	 
	foreach $resultline (@output) {
			if ($resultline =~ m/state=\"($reg)\"/ )	{
				push @arr, $1;
				#chomp $resultline;print $resultline."	".$str."\n";
			}

	} 
}
print "". @arr."\n";
#print scalar(@arr);
$swi->close();
  • Вопрос задан
  • 2617 просмотров
Пригласить эксперта
Ответы на вопрос 1
Net::Telnet немножко надо патчить. Ссылку не дам, ибо жадный (а гугл - нет).
Другой вариант - не патчить, но ставить waitfor больше, prompt всегда иметь верный и правильный.
Как средство - в блоке, где принимаем, указываем waitfor дополнительно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы