问题
If I'm reading multiple $_->{thand}->cmd($cmd)
commands through same telnet connection, I've got disconnects.
This manifests as multiple calls to ae_connect()
. How to properly send and fetch data under 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;
回答1:
I don't think AnyEvent and Net::Telnet will work together. AnyEvent is event based where you have multiple event sources and will act on new data depending on the event source, while Net::Telnet just has a single file handle and blocks waiting for exactly the data it needs at the moment.
If you need multiple Net::Telnet connections in parallel you need to use multiple processes or multiple threads or you might try to use Coroutines (e.g. Coro module).
来源:https://stackoverflow.com/questions/24185046/multiple-telnet-clients-commands-under-anyevent