[PHP] geen timeout bij gebruik raw socket voor ping

Pagina: 1
Acties:
  • 21 views sinds 30-01-2008

  • IWriteCode
  • Registratie: Juli 2000
  • Laatst online: 18-09 13:34

IWriteCode

Less = more

Topicstarter
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:

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


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-11 15:10

Creepy

Tactical Espionage Splatterer

Jamal schreef op vrijdag 25 mei 2007 @ 11:45:
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.
Dus we moeten het of compleet voor je fixen of andere kant en klare code aanraden? Dat is hier niet helemaal de bedoeling.

In eerste instantie zul je toch echt bij de maker van het stuk code moeten zijn voor support en niet hier.

Daarnaast geeft de PHP manual je kant en klare voorbeelden: http://php.net/socket_connect

[ Voor 7% gewijzigd door Creepy op 25-05-2007 12:25 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Dit topic is gesloten.