Heyhoi,
Ik ben met PHP bezig met sockets, maar het wil maar niet lukken.
Wat wil ik?
Ik wil een simpel portscan scriptie maken, eentje die een stuk of 3 / 4 poorten kijkt of ze 'open' zijn, zodat ik kan controleren of het een proxy is (poort 8080 bijvoorbeeld). Ik wil dus niets schrijven of lezen van de socket, alleen kijken of hij kan connecten daarna meteen closen.
En werkt het?
Ja, tenminste als ik blocking sockets gebruik, wat default is. Maar dat betekent dat het script 60 seconden 'vast zit' als de remote host geen antwoord geeft (zoals een firewall die ports stealth maakt). Dus dat is verre van ideaal. Wat ik verder raar vind is dat ik de maximal execution time op 10 seconden heb gezet, maar dat negeert hij kennelijk. Ik wil dus non blocking sockets, waarbij ik kijk of de socket open / closed of nog bezig is en hem laat timeouten na 1 seconde. Klinkt gezellig.
Hoe ziet je code eruit?
(op die laatste twee regels hoef je niet te letten, dat werkt goed bij blocking sockets maar niet bij non blocking sockets)
Wat werkt er dan niet?
Bij elke poort die gescant wordt, is de $err errorcode "Operation now in progress", of ik nou direct erna de foutcode opvraag of na 120 seconden. De poort van de host is wel degelijk open, met blocking sockets werkt het gewoon. Non-blocking sockets werkt gewoon niet. Heel vervelend. Ik zit eraan te denken of dit een PHP bug is, of dat ik gewoon iets fout doe.
Gegevens
Apache: 2.0.53
PHP: 5.0.3 (met sockets gecompileerd)
OS: FreeBSD 5.3
Kunnen jullie me misschien helpen, na vele uren heb ik het opgegeven; het werkt gewoon niet zoals zou moeten. De documentatie van PHP wat betreft de sockets extensie is ook zeer marginaal.
Ik ben met PHP bezig met sockets, maar het wil maar niet lukken.
Wat wil ik?
Ik wil een simpel portscan scriptie maken, eentje die een stuk of 3 / 4 poorten kijkt of ze 'open' zijn, zodat ik kan controleren of het een proxy is (poort 8080 bijvoorbeeld). Ik wil dus niets schrijven of lezen van de socket, alleen kijken of hij kan connecten daarna meteen closen.
En werkt het?
Ja, tenminste als ik blocking sockets gebruik, wat default is. Maar dat betekent dat het script 60 seconden 'vast zit' als de remote host geen antwoord geeft (zoals een firewall die ports stealth maakt). Dus dat is verre van ideaal. Wat ik verder raar vind is dat ik de maximal execution time op 10 seconden heb gezet, maar dat negeert hij kennelijk. Ik wil dus non blocking sockets, waarbij ik kijk of de socket open / closed of nog bezig is en hem laat timeouten na 1 seconde. Klinkt gezellig.
Hoe ziet je code eruit?
code:
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
| $scanports = array(25,80,8080); // set timeout to 1 second $timeout = 1; foreach ($scanports as $port) { $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_nonblock($sock); $sock_state = @socket_connect($sock, $ip, (int)$port); $time = time(); while ((time() - $time) < $timeout) // while not timed out.. { $err = socket_last_error($sock); if ($err == 36 || $err == 37) // waiting for response { // sleep 0,2 seconds usleep(200000); continue; } elseif ($err == 56) break; else error('Socket error: ['.$err.'] '.socket_strerror($err) . "\n"); } socket_close($sock); echo('<p>'.socket_strerror($err).'</p>'); if ($sock_state === true) echo('<li>Port '.$port.' <b>( '.getservbyport($port,'tcp').' )</b> is open</li>'); } |
(op die laatste twee regels hoef je niet te letten, dat werkt goed bij blocking sockets maar niet bij non blocking sockets)
Wat werkt er dan niet?
Bij elke poort die gescant wordt, is de $err errorcode "Operation now in progress", of ik nou direct erna de foutcode opvraag of na 120 seconden. De poort van de host is wel degelijk open, met blocking sockets werkt het gewoon. Non-blocking sockets werkt gewoon niet. Heel vervelend. Ik zit eraan te denken of dit een PHP bug is, of dat ik gewoon iets fout doe.
Gegevens
Apache: 2.0.53
PHP: 5.0.3 (met sockets gecompileerd)
OS: FreeBSD 5.3
Kunnen jullie me misschien helpen, na vele uren heb ik het opgegeven; het werkt gewoon niet zoals zou moeten. De documentatie van PHP wat betreft de sockets extensie is ook zeer marginaal.