AnyEvent-Ping
view release on metacpan or search on metacpan
lib/AnyEvent/Ping.pm view on Meta::CPAN
# Create Poll object
$self->{_poll_read} = AnyEvent->io(
fh => $socket,
poll => 'r',
cb => sub { $self->_on_read },
);
# Ping tasks
$self->{_tasks} = [];
$self->{_tasks_out} = [];
$self->{_timers} = {};
return $self;
}
sub interval { @_ > 1 ? $_[0]->{interval} = $_[1] : $_[0]->{interval} }
sub timeout { @_ > 1 ? $_[0]->{timeout} = $_[1] : $_[0]->{timeout} }
sub error { $_[0]->{error} }
lib/AnyEvent/Ping.pm view on Meta::CPAN
$self->_add_write_poll;
return $self;
}
sub end {
my $self = shift;
delete $self->{_poll_read};
delete $self->{_poll_write};
delete $self->{_timers};
while (my $request = pop @{$self->{_tasks}}) {
$request->{cb}->($request->{results});
}
close delete $self->{_socket}
if exists $self->{_socket};
}
sub generate_data_random {
lib/AnyEvent/Ping.pm view on Meta::CPAN
$self->_store_result($request, 'TIMEOUT');
}
}
sub _store_result {
my ($self, $request, $result) = @_;
my $results = $request->{results};
# Clear request specific data
delete $self->{_timers}->{$request};
push @$results, [$result, time - $request->{start}];
if (@$results == $request->{times} || $result eq 'ERROR') {
# Cleanup
my $tasks = $self->{_tasks};
for my $i (0 .. scalar @$tasks) {
if ($tasks->[$i] == $request) {
splice @$tasks, $i, 1;
lib/AnyEvent/Ping.pm view on Meta::CPAN
# Testing done
$request->{cb}->($results);
undef $request;
}
# Perform another check
else {
# Setup interval timer before next request
$self->{_timers}{$request} = AnyEvent->timer(
after => $self->interval,
cb => sub {
delete $self->{_timers}{$request};
push @{$self->{_tasks_out}}, $request;
$self->_add_write_poll;
}
);
}
}
sub _send_request {
my ($self, $request) = @_;
lib/AnyEvent/Ping.pm view on Meta::CPAN
$checksum = $self->_icmp_checksum($msg);
$msg = pack $ICMP_PING,
0x08, 0x00, $checksum,
$identifier, $sequence, $data;
$request->{data} = $data;
$request->{start} = time;
$self->{_timers}->{$request}->{timer} = AnyEvent->timer(
after => $self->timeout,
cb => sub {
$self->_store_result($request, 'TIMEOUT');
}
);
my $socket = $self->{_socket};
$socket->send($msg, 0, $request->{destination}) or
$self->_store_result($request, 'ERROR');
( run in 1.010 second using v1.01-cache-2.11-cpan-49f99fa48dc )