ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-FastPing/FastPing.pm
(Generate patch)

Comparing AnyEvent-FastPing/FastPing.pm (file contents):
Revision 1.9 by root, Sun Jan 16 11:48:15 2011 UTC vs.
Revision 1.12 by root, Tue Feb 1 04:06:24 2011 UTC

26use common::sense; 26use common::sense;
27 27
28use AnyEvent; 28use AnyEvent;
29 29
30BEGIN { 30BEGIN {
31 our $VERSION = '1.14'; 31 our $VERSION = '2.0';
32 our @ISA = qw(Exporter); 32 our @ISA = qw(Exporter);
33 33
34 require Exporter; 34 require Exporter;
35 #Exporter::export_ok_tags (keys %EXPORT_TAGS); 35 #Exporter::export_ok_tags (keys %EXPORT_TAGS);
36 36
37 require XSLoader; 37 require XSLoader;
38 XSLoader::load (__PACKAGE__, $VERSION); 38 XSLoader::load (__PACKAGE__, $VERSION);
39} 39}
40 40
41our ($THR_REQ_FD, $THR_RES_FD, $ICMP4_FD, $ICMP6_FD); 41our ($THR_RES_FD, $ICMP4_FD, $ICMP6_FD);
42 42
43our $THR_REQ_FH; open $THR_REQ_FH, ">&=$THR_REQ_FD" or die "FATAL: cannot fdopen";
44our $THR_RES_FH; open $THR_RES_FH, "<&=$THR_RES_FD" or die "FATAL: cannot fdopen"; 43our $THR_RES_FH; open $THR_RES_FH, "<&=$THR_RES_FD" or die "FATAL: cannot fdopen";
45 44
46our $THR_REQ_W; 45our $ICMP4_FH; our $ICMP4_W = $ICMP4_FD >= 0 && (open $ICMP4_FH, "<&=$ICMP4_FD") && AE::io $ICMP4_FH, 0, \&_recv_icmp4;
46our $ICMP6_FH; our $ICMP6_W = $ICMP6_FD >= 0 && (open $ICMP6_FH, "<&=$ICMP6_FD") && AE::io $ICMP6_FH, 0, \&_recv_icmp6;
47
48=item AnyEvent::FastPing::ipv4_supported
49
50Returns true if IPv4 is supported in this module and on this system.
51
52=item AnyEvent::FastPing::ipv6_supported
53
54Returns true if IPv6 is supported in this module and on this system.
55
56=item AnyEvent::FastPing::icmp4_pktsize
57
58Returns the number of bytes each IPv4 ping packet has.
59
60=item AnyEvent::FastPing::icmp6_pktsize
61
62Returns the number of bytes each IPv4 ping packet has.
63
64=cut
65
66sub new {
67 my ($klass) = @_;
68
69 _new $klass, (rand 65536), (rand 65536), (rand 65536)
70}
71
72our @IDLE_CB;
73
74sub DESTROY {
75 undef $IDLE_CB[ &id ];
76 &_free;
77}
78
79sub on_idle {
80 $IDLE_CB[ &id ] = $_[1];
81}
82
47our $THR_RES_W = AE::io $THR_RES_FH, 0, sub { 83our $THR_RES_W = AE::io $THR_RES_FH, 0, sub {
48 my $sv = _read_res 84 sysread $THR_RES_FH, my $buf, 8;
49 or return;
50 85
51 $sv->(); 86 for my $id (unpack "S*", $buf) {
87 _stop_id $id;
88 ($IDLE_CB[$id] || sub { })->();
89 }
52}; 90};
53 91
54our $THR_REQ_BUF; 92for(1..10) {
93my $p = new AnyEvent::FastPing;#d#
94$p->interval (0);
95$p->max_rtt (0.5);
96#$p->add_range (v127.0.0.1, v127.255.255.254, 0);
97$p->add_range (v127.0.0.1, v127.0.0.1, 0);
98#$p->add_range (v1.0.0.1, v1.255.255.254, 0);
99$p->on_idle (my $cv = AE::cv);
100my $cnt;
101$p->on_recv (sub {
102 $cnt++;
103});
104$p->start;
55 105
56sub _send_req($) { 106{
57 $THR_REQ_BUF .= $_[0]; 107 my $p = new AnyEvent::FastPing;#d#
58 108 $p->interval (0);
59 $THR_REQ_W ||= AE::io $THR_REQ_FH, 1, sub { 109 $p->max_rtt (0.5);
60 my $len = syswrite $THR_REQ_FH, $THR_REQ_BUF; 110 $p->add_hosts ([v0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2, (v0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1)x8, v0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3], 0);
61 substr $THR_REQ_BUF, 0, $len, ""; 111 my $cnt;
62 112 $p->on_recv (sub {
63 undef $THR_REQ_W unless length $THR_REQ_BUF; 113 use Data::Dump; ddx \@_;
64 }; 114 });
115 $p->on_idle (sub {
116 undef $p;
117 });
118 $p->start;
65} 119}
66 120
67=item AnyEvent::FastPing::ipv4_supported 121$cv->recv;
68 122warn $cnt;
69Returns true if IPv4 is supported in this module and on this system. 123}
70
71=item AnyEvent::FastPing::ipv6_supported
72
73Returns true if IPv6 is supported in this module and on this system.
74
75=item AnyEvent::FastPing::icmp4_pktsize
76
77Returns the number of bytes each IPv4 ping packet has.
78
79=item AnyEvent::FastPing::icmp6_pktsize
80
81Returns the number of bytes each IPv4 ping packet has.
82 124
83=item AnyEvent::FastPing::icmp_ping [ranges...], $send_interval, $payload, \&callback 125=item AnyEvent::FastPing::icmp_ping [ranges...], $send_interval, $payload, \&callback
84 126
85Ping the given IPv4 address ranges. Each range is an arrayref of the 127Ping the given IPv4 address ranges. Each range is an arrayref of the
86form C<[lo, hi, interval]>, where C<lo> and C<hi> are octet strings with 128form C<[lo, hi, interval]>, where C<lo> and C<hi> are octet strings with
140 $done->wait; 182 $done->wait;
141 183
142=cut 184=cut
143 185
144sub icmp_ping($$$&) { 186sub icmp_ping($$$&) {
145 _send_req _req_icmp_ping @_; 187# _send_req _req_icmp_ping @_;
146} 188}
147
148our $ICMP4_FH;
149our $ICMP4_W = (open $ICMP4_FH, "<&=$ICMP4_FD") && AE::io $ICMP4_FH, 0, \&_recv_icmp4;
150our $ICMP6_FH;
151our $ICMP6_W = (open $ICMP6_FH, "<&=$ICMP6_FD") && AE::io $ICMP6_FH, 0, \&_recv_icmp6;
152 189
153=item AnyEvent::FastPing::register_cb \&cb 190=item AnyEvent::FastPing::register_cb \&cb
154 191
155Register a callback that is called for every received ping reply 192Register a callback that is called for every received ping reply
156(regardless of whether a ping is still in process or not and regardless of 193(regardless of whether a ping is still in process or not and regardless of

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines