Perl 检测主机网络事件模块-AnyEvent::Ping
2019-06-11 18:20:15 阿炯

AnyEvent::Ping is an asynchronous AnyEvent pinger.这是一个基于AnyEvent事件驱动机制的ping工具函数。

相关属性

interval

my $interval = $ping->interval;
$ping->interval(1);
Interval between pings, defaults to 0.2 seconds.
ping之间的间隔,默认为0.2秒。

timeout

my $timeout = $ping->timeout;
$ping->timeout(3);
Maximum response time, defaults to 5 seconds.
最大响应时间,默认5秒。

error

my $error = $ping->error;
Last error message.
最近的错误消息。

相关方法

new

my $ping = AnyEvent::Ping->new(%options)

Constructs AnyEvent::Ping object. Following options can be passed:
interval
timeout
on_prepare
In some cases you need to "tune" the socket before it is used to ping (for exmaple, to bind it on a given IP address).

my $ping = AnyEvent::Ping->new(
    on_prepare => sub {
        my $socket = shift;
        ...
});

packet_generator
Generates the data to be sent.

my $ping = AnyEvent::Ping->new(
    packet_generator => sub {
        &AnyEvent::Ping::generate_data_random($packet_size);
});

packet_size
You can set the number of data bytes to be sent, if packet generation function is not set. The default is 56, which translates into 64 ICMP data bytes when combined with the 8 bytes of ICMP header data.

my $ping = AnyEvent::Ping->new(packet_size => 56);

Each packet will be generated with generate_data_random() like this:

&AnyEvent::Ping::generate_data_random($packet_size);

ping

$ping->ping($ip, $n => sub {
    my $results = shift;
    foreach my $result (@$results){
        my ($status, $time) = @$result;
        ...
    };
});

Perform a ping of a given $ip address $n times.
对给定ip地址ping n次。

end

$ping->end;

Ends all pings and releases resources.
结束所有的ping并释放资源。

示例
对内网一段ip进行ping检测,并设定并发数量。

use v5.20;
use AnyEvent;
use Data::Dumper;
use AnyEvent::Ping;
my ($cnt,$max) = (0,9); #并发数
my @todoList = map { "10.206.30." . $_ }(70..99); #
my $cv = AnyEvent->condvar;
my $ping = AnyEvent::Ping->new;
$ping->timeout(3);

pingit() foreach 1..$max;

$cv->recv();
$ping->end;

sub pingit{
    return if $cnt >= $max;
    my $ip = shift @todoList;
    return if not defined $ip;
    $cnt++ && say "Count $cnt when ping $ip.";
    $cv->begin;
    $ping->ping($ip, 2, sub{
        my ($result) = @_;
        $cnt--;
        #say Dumper($result);
        $cv->end();
        say "Result($ip):$result->[0][0] in $result->[0][1] seconds.";
        pingit();
    });
    return 1;
}

最新版本:0.1


项目主页:https://metacpan.org/release/AnyEvent-Ping