Perl AnyEvent下的多个telnet客户端/命令
如果我通过同一个telnet连接读取多个Perl AnyEvent下的多个telnet客户端/命令,perl,telnet,anyevent,Perl,Telnet,Anyevent,如果我通过同一个telnet连接读取多个$\uU->{thand}->cmd($cmd)命令,我会断开连接 这表现为对ae\u connect()的多次调用。如何在AnyEvent下正确发送和获取数据 use strict; use warnings; use Data::Dumper; use AnyEvent::Socket; use AnyEvent; use Net::Telnet; $| = 1; my $arr = [ { username => "user+ct",
$\uU->{thand}->cmd($cmd)
命令,我会断开连接
这表现为对ae\u connect()
的多次调用。如何在AnyEvent
下正确发送和获取数据
use strict;
use warnings;
use Data::Dumper;
use AnyEvent::Socket;
use AnyEvent;
use Net::Telnet;
$| = 1;
my $arr = [
{ username => "user+ct", passwd => "1234", Host => "92.242.254.8", Port => 1094 },
{ username => "user+ct", passwd => "1234", Host => "92.242.254.8", Port => 1095 },
{ username => "user+ct", passwd => "1234", Host => "92.242.254.8", Port => 1096 },
];
sub main_loop {
my $cmd = "/ip firewall filter export";
my $i=0;
for (@$arr) {
if (!$_->{thand}) {
ae_connect($_);
print("skip ", Dumper $_);
next;
}
# print Dumper $_;
$i++;
my $s;
$s = join "", $_->{thand}->cmd($cmd);
# print "\n==1>$i \n$s";
$s = join "", $_->{thand}->cmd($cmd);
$s = join "", $_->{thand}->cmd($cmd);
}
print "\n\n";
#die @$arr*1 if $i;
}
sub ae_connect {
my ($tc) = @_;
print "=========== $tc->{Host} ============\n";
tcp_connect $tc->{Host}, $tc->{Port} //23, sub {
my ($fh) = @_ or return; # die "failed: $!";
#
my $t = new Net::Telnet->new(Fhopen => $fh) or return;
eval { $t->login($tc->{username}, $tc->{passwd}) } or return;
$t->timeout($tc->{Timeout});
$tc->{thand} = $t;
# $tc->{fh} = $fh;
};
}
my $w = AnyEvent->timer(after => 0, interval => 1, cb => \&main_loop);
my $cv = AnyEvent->condvar;
$cv->recv;
我认为AnyEvent和Net::Telnet不会一起工作。AnyEvent是基于事件的,其中您有多个事件源,并将根据事件源对新数据进行操作,而Net::Telnet只有一个文件句柄和块,它们正等待当前所需的数据
如果您需要多个Net::Telnet并行连接,则需要使用多个进程或多个线程,或者您可以尝试使用协同路由(例如,Coro模块)。上述示例实际上按预期工作,但从同一句柄执行多个命令时除外。它甚至可以像从本地网络一样工作,但通过互联网它可以重新连接。我假设它与延迟有关,而代码并没有像它应该的那样处理它。顺便说一句,你应该能够执行我在发布之前尝试过的脚本。是否有一些Coro的食谱,因为与Anyevent一样的文档缺少示例?@mpapec:Coro和Anyevent都有很多示例和文档。它们都有一个带有示例的eg/目录,t/中的大量测试可以用作示例,并且有一个明确的介绍(Intro.pod)。