AnyEvent-FastPing
view release on metacpan or search on metacpan
FastPing.xs view on Meta::CPAN
totlen = ntohs (iphdr->tot_len);
if (totlen > len
|| iphdr->protocol != IPPROTO_ICMP
|| hdrlen < HDR_SIZE_IP4 || hdrlen + sizeof (PKT) != totlen)
continue;
pkt = (PKT *)(buf + hdrlen);
if (pkt->type != ICMP4_ECHO_REPLY
|| pkt->pinger >= pingercnt
|| !pingers [pkt->pinger])
continue;
pinger = pingers [pkt->pinger];
if (!pkt_is_valid_for (pkt, pinger))
continue;
recv_feed (pinger, &sa.sin_addr, 4, NOW () - pkt_to_ts (pkt));
}
recv_flush ();
}
void
_recv_icmp6 (...)
CODE:
{
struct sockaddr_in6 sa;
PKT pkt;
int maxrecv;
for (maxrecv = 256+1; --maxrecv; )
{
PINGER *pinger;
socklen_t sl = sizeof (sa);
int len = recvfrom (icmp6_fd, &pkt, sizeof (pkt), MSG_TRUNC, (struct sockaddr *)&sa, &sl);
if (len != sizeof (PKT))
break;
if (pkt.type != ICMP6_ECHO_REPLY
|| pkt.pinger >= pingercnt
|| !pingers [pkt.pinger])
continue;
pinger = pingers [pkt.pinger];
if (!pkt_is_valid_for (&pkt, pinger))
continue;
recv_feed (pinger, &sa.sin6_addr, 16, NOW () - pkt_to_ts (&pkt));
}
recv_flush ();
}
void
_new (SV *klass, UV magic1, UV magic2, UV magic3)
PPCODE:
{
SV *pv = NEWSV (0, sizeof (PINGER));
PINGER *self = (PINGER *)SvPVX (pv);
SvPOK_only (pv);
XPUSHs (sv_2mortal (sv_bless (newRV_noinc (pv), gv_stashpv (SvPVutf8_nolen (klass), 1))));
pinger_init (self);
self->magic1 = magic1;
self->magic2 = magic2;
self->magic3 = magic3;
}
void
_free (PINGER *self)
CODE:
pinger_free (self);
IV
id (PINGER *self, ...)
CODE:
RETVAL = self->id;
OUTPUT:
RETVAL
void pinger_start (PINGER *self)
void pinger_stop (PINGER *self)
void
_stop_id (UV id)
CODE:
if (id < pingercnt && pingers [id])
pinger_stop (pingers [id]);
void
interval (PINGER *self, NV interval)
CODE:
NOT_RUNNING;
self->interval = interval > MIN_INTERVAL ? interval : MIN_INTERVAL;
void
max_rtt (PINGER *self, NV maxrtt)
CODE:
NOT_RUNNING;
self->maxrtt = maxrtt;
void
on_recv (PINGER *self, SV *cb)
CODE:
SvREFCNT_dec (self->recvcb);
self->recvcb = newSVsv (cb);
void
add_range (PINGER *self, SV *lo_, SV *hi_, NV interval = 0)
CODE:
{
STRLEN lo_len, hi_len;
char *lo = SvPVbyte (lo_, lo_len);
char *hi = SvPVbyte (hi_, hi_len);
RANGE *range;
( run in 0.529 second using v1.01-cache-2.11-cpan-71847e10f99 )