1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 08:12:21 +01:00
Files
archived-php-src/ext/sockets/tests/socket_icmp.phpt
David Carlier 33ba1a4ab9 ext/sockets: adding IPPROTO_ICMP* constants for socket creations.
Is to create socket for Internet Control Message Protocol context.
Due to their nature, they are meant to be used via
raw sockets rather than TCP/UDP.

close GH-16737
2024-11-12 18:52:22 +00:00

58 lines
1.5 KiB
PHP

--TEST--
socket_create with IPPROTO_ICMP
--EXTENSIONS--
sockets
--SKIPIF--
<?php
if (!defined("IPPROTO_ICMP")) die("skip IPPROTO_ICMP not available");
// IPPROTO_ICMP* functions with raw sockets, thus requiring administrative role.
if (PHP_OS_FAMILY !== "Windows" && (!function_exists("posix_getuid") || posix_getuid() != 0)) die('skip IPPROTO_ICMP requires root permissions.');
?>
--FILE--
<?php
$host = '127.0.0.1';
$type = 8;
$code = 0;
$identifier = 16;
$sequence = 1;
$data = "ECHO";
$socket = socket_create(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if (!$socket) {
die("Unable to create socket: " . socket_strerror(socket_last_error()) . "\n");
}
$header = pack('C2n3a*', $type, $code, 0, $identifier, $sequence, $data);
$checksum = function($header): int {
$bit = unpack('n*', $header);
$sum = array_sum($bit);
while ($sum >> 16) {
$sum = ($sum & 0xFFFF) + ($sum >> 16);
}
return ~ $sum & 0xFFFF;
};
$header = pack('C2n3a*', $type, $code, $checksum($header), $identifier, $sequence, $data);
if (!socket_sendto($socket, $header, strlen($header), 0, $host, 0)) {
die("Unable to send packet: " . socket_strerror(socket_last_error($socket)) . "\n");
}
$read = [$socket];
$write = $except = [];
$timeout = ['sec' => 4, 'usec' => 0];
if (socket_select($read, $write, $except, $timeout['sec'], $timeout['usec']) > 0) {
$response = '';
socket_recv($socket, $response, 65535, 0);
var_dump(bin2hex($response));
} else {
die("Unable to read the response\n");
}
socket_close($socket);
?>
--EXPECTF--
string(64) "%s"