Ik gebruik volgend stukje code om te pingen naar verschillende pda toestellen die wij in het bedrijf in gebruik hebben om te zien of de toestellen aangelogt zijn op het netwerk :
De code werkt perfect voor enkele opvragingen, als ik dit echt in een lus programmeer komt het script vast te zitten en dit op op de lijn waar de instructie socket_recv wordt uitgevoerd.
Als ik de @ wegneem krijg ik volgende fout te zien : "Fatal error: Maximum execution time of 30 seconds exceeded in C:\Inetpub\wwwroot\test\ping\ping.php on line 97" en dit na 11 pogingen naar hetzelfde adres.
De set_time_limit wil ik niet aanpassen, ik zou willen dat ik bijvoorbeeld 20 verschillende adressen kan pingen.
Ik heb al geprobeerd om de sockets telkens te sluiten maar dit bied geen oplossing.
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
| <?php class Net_Ping { var $icmp_socket; var $request; var $request_len; var $reply; var $errstr; var $time; var $timer_start_time; function Net_Ping() { $this->icmp_socket = socket_create(AF_INET, SOCK_RAW, 1); socket_set_block($this->icmp_socket); } function ip_checksum($data) { for($i=0;$i<strlen($data);$i += 2) { if($data[$i+1]) $bits = unpack('n*',$data[$i].$data[$i+1]); else $bits = unpack('C*',$data[$i]); $sum += $bits[1]; } while ($sum>>16) $sum = ($sum & 0xffff) + ($sum >> 16); $checksum = pack('n1',~$sum); return $checksum; } function start_time() { $this->timer_start_time = microtime(); } function get_time($acc=2) { // format start time $start_time = explode (" ", $this->timer_start_time); $start_time = $start_time[1] + $start_time[0]; // get and format end time $end_time = explode (" ", microtime()); $end_time = $end_time[1] + $end_time[0]; return number_format ($end_time - $start_time, $acc); } function Build_Packet() { $data = "abcdefghijklmnopqrstuvwabcdefghi"; // the actual test data $type = "\x08"; // 8 echo message; 0 echo reply message $code = "\x00"; // always 0 for this program $chksm = "\x00\x00"; // generate checksum for icmp request $id = "\x00\x00"; // we will have to work with this later $sqn = "\x00\x00"; // we will have to work with this later // now we need to change the checksum to the real checksum $chksm = $this->ip_checksum($type.$code.$chksm.$id.$sqn.$data); // now lets build the actual icmp packet $this->request = $type.$code.$chksm.$id.$sqn.$data; $this->request_len = strlen($this->request); } function Ping($dst_addr,$timeout=5,$percision=3) { // lets catch dumb people if ((int)$timeout <= 0) $timeout=5; if ((int)$percision <= 0) $percision=3; // set the timeout socket_set_option($this->icmp_socket, SOL_SOCKET, // socket level SO_RCVTIMEO, // timeout option array( "sec"=>$timeout, // Timeout in seconds "usec"=>0 // I assume timeout in microseconds ) ); if ($dst_addr) { if (@socket_connect($this->icmp_socket, $dst_addr, NULL)) { } else { $this->errstr = "Cannot connect to $dst_addr"; return FALSE; } $this->Build_Packet(); $this->start_time(); socket_write($this->icmp_socket, $this->request, $this->request_len); if (@socket_recv($this->icmp_socket, &$this->reply, 256, 0)) { $this->time = $this->get_time($percision); return $this->time; } else { $this->errstr = "Timed out"; return FALSE; } } else { $this->errstr = "Destination address not specified"; return FALSE; } } } $ping = new Net_Ping; $ping->ping("10.1.10.5",2); if ($ping->time) echo "Time: ".$ping->time; else echo $ping->errstr; ?> |
De code werkt perfect voor enkele opvragingen, als ik dit echt in een lus programmeer komt het script vast te zitten en dit op op de lijn waar de instructie socket_recv wordt uitgevoerd.
Als ik de @ wegneem krijg ik volgende fout te zien : "Fatal error: Maximum execution time of 30 seconds exceeded in C:\Inetpub\wwwroot\test\ping\ping.php on line 97" en dit na 11 pogingen naar hetzelfde adres.
De set_time_limit wil ik niet aanpassen, ik zou willen dat ik bijvoorbeeld 20 verschillende adressen kan pingen.
Ik heb al geprobeerd om de sockets telkens te sluiten maar dit bied geen oplossing.