--- AnyEvent-FastPing/FastPing.pm 2011/01/29 23:55:37 1.10 +++ AnyEvent-FastPing/FastPing.pm 2011/01/31 05:35:48 1.11 @@ -28,7 +28,7 @@ use AnyEvent; BEGIN { - our $VERSION = '1.15'; + our $VERSION = '2.0'; our @ISA = qw(Exporter); require Exporter; @@ -38,31 +38,12 @@ XSLoader::load (__PACKAGE__, $VERSION); } -our ($THR_REQ_FD, $THR_RES_FD, $ICMP4_FD, $ICMP6_FD); +our ($THR_RES_FD, $ICMP4_FD, $ICMP6_FD); -our $THR_REQ_FH; open $THR_REQ_FH, ">&=$THR_REQ_FD" or die "FATAL: cannot fdopen"; our $THR_RES_FH; open $THR_RES_FH, "<&=$THR_RES_FD" or die "FATAL: cannot fdopen"; -our $THR_REQ_W; -our $THR_RES_W = AE::io $THR_RES_FH, 0, sub { - my $sv = _read_res - or return; - - $sv->(); -}; - -our $THR_REQ_BUF; - -sub _send_req($) { - $THR_REQ_BUF .= $_[0]; - - $THR_REQ_W ||= AE::io $THR_REQ_FH, 1, sub { - my $len = syswrite $THR_REQ_FH, $THR_REQ_BUF; - substr $THR_REQ_BUF, 0, $len, ""; - - undef $THR_REQ_W unless length $THR_REQ_BUF; - }; -} +our $ICMP4_FH; our $ICMP4_W = $ICMP4_FD >= 0 && (open $ICMP4_FH, "<&=$ICMP4_FD") && AE::io $ICMP4_FH, 0, \&_recv_icmp4; +our $ICMP6_FH; our $ICMP6_W = $ICMP6_FD >= 0 && (open $ICMP6_FH, "<&=$ICMP6_FD") && AE::io $ICMP6_FH, 0, \&_recv_icmp6; =item AnyEvent::FastPing::ipv4_supported @@ -80,6 +61,50 @@ Returns the number of bytes each IPv4 ping packet has. +=cut + +sub new { + my ($klass) = @_; + + _new $klass, (rand 65536), (rand 65536), (rand 65536) +} + +our @IDLE_CB; + +sub DESTROY { + undef $IDLE_CB[ &id ]; + &_free; +} + +sub on_idle { + $IDLE_CB[ &id ] = $_[1]; +} + +our $THR_RES_W = AE::io $THR_RES_FH, 0, sub { + sysread $THR_RES_FH, my $buf, 8; + + for my $id (unpack "S*", $buf) { + _stop_id $id; + ($IDLE_CB[$id] || sub { })->(); + } +}; + +for(1..10) { +my $p = new AnyEvent::FastPing;#d# +$p->interval (0); +$p->max_rtt (0.5); +#$p->add_range (v127.0.0.1, v127.255.255.254, 0); +$p->add_range (v1.0.0.1, v1.255.255.254, 0); +$p->on_idle (my $cv = AE::cv); +my $cnt; +$p->on_recv (sub { + $cnt++; +}); +$p->start; +$cv->recv; +warn $cnt; +} + =item AnyEvent::FastPing::icmp_ping [ranges...], $send_interval, $payload, \&callback Ping the given IPv4 address ranges. Each range is an arrayref of the @@ -142,12 +167,9 @@ =cut sub icmp_ping($$$&) { - _send_req _req_icmp_ping @_; +# _send_req _req_icmp_ping @_; } -our $ICMP4_FH; our $ICMP4_W = $ICMP4_FD >= 0 && (open $ICMP4_FH, "<&=$ICMP4_FD") && AE::io $ICMP4_FH, 0, \&_recv_icmp4; -our $ICMP6_FH; our $ICMP6_W = $ICMP6_FD >= 0 && (open $ICMP6_FH, "<&=$ICMP6_FD") && AE::io $ICMP6_FH, 0, \&_recv_icmp6; - =item AnyEvent::FastPing::register_cb \&cb Register a callback that is called for every received ping reply