Voting

: zero plus four?
(Example: nine)

The Note You're Voting On

Sakrizz
8 years ago
Here's a solution for icmpv6 ping with php, dropping it here in case if someone has problems with icmpv6 with php.

<?php
$host
= "2a03:2880:f11b:83:face:b00c:0:25de";
$timeout = 100000;
$count = 3;
echo
"Latency: ". round(1000 * pingv6($host,$timeout,$count),5) ." ms \n";

function
pingv6($target,$timeout,$count) {
echo
"target is ipv6 address, ". getprotobyname('ipv6-icmp'). " \n";
/* create the socket, the last '1' denotes ICMP */
$socket = socket_create(AF_INET6, SOCK_RAW, getprotobyname('ipv6-icmp'));
/* set socket receive timeout to 1 second */
$sec=intval($timeout/1000);
$usec=$timeout%1000*1000;
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>$sec, "usec"=>$usec));
/* socket package parameters */
$type = "\x80";
$seqNumber = chr(floor($i/256)%256) . chr($i%256);
$checksum= "\x00\x00";
$code = "\x00";
$identifier = chr(rand(0,255)) . chr(rand(0,255));
$msg = "!\"#$%&'()*+,-./1234567";
$package = $type.$code.$checksum.$identifier.$seqNumber.$msg;
$checksum = icmpChecksum($package);
$package = $type.$code.$checksum.$identifier.$seqNumber.$msg;
/* socket connect */
if(@socket_connect($socket, $target, null)){
for(
$i = 0; $i < $count; $i++){
list(
$start_usec, $start_sec) = explode(" ", microtime());
$start_time = ((float) $start_usec + (float) $start_sec);
$startTime = microtime(true);
socket_send($socket, $package, strLen($package), 0);
while (
$startTime + $timeout*1000 > microtime(true)){
if(
socket_read($socket, 255) !== false) {
list(
$end_usec, $end_sec) = explode(" ", microtime());
$end_time = ((float) $end_usec + (float) $end_sec);
$total_time = $end_time - $start_time;
echo
"round trip time (".$i."): ". $total_time ."\n";
return
$total_time;
break;
}else{
return
"null";
echo
"Timed out (".$i."), Got no echo reply\n";
break;
}
}
usleep($interval*1000);
}
socket_close($socket);
}
}

function
icmpChecksum($data){
if (
strlen($data)%2) $data .= "\x00";
$bit = unpack('n*', $data);
$sum = array_sum($bit);
while (
$sum >> 16)
$sum = ($sum >> 16) + ($sum & 0xffff);
return
pack('n*', ~$sum);
}

?>

<< Back to user notes page

To Top