Hallo,
Voor het weergeven van de status van een aantal apparaten wil ik in php een ping gaan uitvoeren. Nu heb ik op internet het volgende stukje code gevonden:
Deze code werkt prima als de host te pingen is, maar als de host niet te pingen is, dan treedt er geen timeout op!
Nu ben ik al aan het kijken geweest naar set_socket_option om de timeout te zetten:
Maar dat verandert niets.
Ook het veranderen van het lezen naar non-blocking mode lost het probleem niet op, dan krijg je warnings dat er niet gelezen kan worden.
Wie o wie helpt mij uit de brand... bij voorkeur door de bovenstaande code te laten werken met een timeout, maar anders een goed alternatief voor dit script om ping wel te laten werken... zelf ook nog geen goed alternatief gevonden.
Voor het weergeven van de status van een aantal apparaten wil ik in php een ping gaan uitvoeren. Nu heb ik op internet het volgende stukje code gevonden:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| <?php // Checksum calculation function 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); } // Making the package $type= "\x08"; $code= "\x00"; $checksum= "\x00\x00"; $identifier = "\x00\x00"; $seqNumber = "\x00\x00"; $data= "Scarface"; $package = $type.$code.$checksum.$identifier.$seqNumber.$data; $checksum = icmpChecksum($package); // Calculate the checksum $package = $type.$code.$checksum.$identifier.$seqNumber.$data; // And off to the sockets $socket = socket_create(AF_INET, SOCK_RAW, 1); socket_connect($socket, "www.google.com", null); // If you're using below PHP 5, see the manual for the microtime_float // function. Instead of just using the m // icrotime() function. $startTime = microtime(true); socket_send($socket, $package, strLen($package), 0); if (socket_read($socket, 255)) { echo round(microtime(true) - $startTime, 4) .' seconds'; } socket_close($socket); ?> |
Deze code werkt prima als de host te pingen is, maar als de host niet te pingen is, dan treedt er geen timeout op!
Nu ben ik al aan het kijken geweest naar set_socket_option om de timeout te zetten:
PHP:
1
| socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>0, "usec"=>100)); |
Maar dat verandert niets.
Ook het veranderen van het lezen naar non-blocking mode lost het probleem niet op, dan krijg je warnings dat er niet gelezen kan worden.
Wie o wie helpt mij uit de brand... bij voorkeur door de bovenstaande code te laten werken met een timeout, maar anders een goed alternatief voor dit script om ping wel te laten werken... zelf ook nog geen goed alternatief gevonden.
Less = more