Implementace ICMP Pingu v PHP
Transkript
Implementace ICMP Pingu v PHP
autor: Johny, site, dne 10.1.2013
Potřeboval jsem naprogramovat poměrně sofistikovaný script, který bude kontrolovat dostupnost internetu. V případě výpadku
analyzuje situaci a podle potřeby automaticky modifikuje routovací tabulku na routerech. Protože takovéto utilitky programuji
nejčastěji v PHP5, tak jsem hledal řešení jak z PHP poslat ping. PHP ping st tak stal základním stavebním kamenem mého scriptu
a protože jsem se nad ním pořádně zapotil, rozhodl jsem se tento kus kódu dát veřejně k dispozici. Třeba se někomu taky hodí.
Chci čistě PHP řešení
Protože jde o script, který by měl být maximálně spolehlivý, chci se vyhnout velké složitosti. Nechci jej řešit voláním externích
„programů“, každé další volání by zbytečně zatěžuje systém. Nechci se spoléhat na návratové kódy. PHP ovšem nenabízí mnoho
podpory, ale s tím, co umí to půjde.
Jak to tedy funguje?
Narazil jsem ale na celou řadu problémů. PHP nemá samo o sobě moc protokolu ICMP. Musel jsem tedy přistoupit k použití
síťového RAW socketu a posílat tak „čistá“ data. Nevýhodou je, že pod linuxem má k raw socketu přístup jenom root (pod win taky,
né?). Je to obrana před generováním „bordelu“ a „floodování“ sítě pro běžné uživatele.
Moje implementace je pouze velice základní.
vytvořím socket a nastavím timeout
připojím se k serveru
zašlu připravený paket \x08\x00\x7d\x4b\x00\x00\x00\x00PingHost
\x08 je dle wikipedie ECHO_REQUEST
počkám, než mi přijde odpověď, nebo timeoutuji
pokud první „znak“ odpovědi je „E“, jedná se o ECHO REPLAY, změřím tedy čas a vrátím jej v sekundách
pokud přijde odpověď ale neobsahuje „E“, jde nejspíš o nějakou ICMP hlášku typu „Destination host unrechable“ nebo
„Time exceeded“, tedy vrátím FALSE
pokud timeautuji, vrátím False
Všechny tři stavy mají i možnost „verbose“, tedy lidský výpis toho, co se opravdu stalo.
A zde je kód, možná se někomu hodí…
<?PHP
function php_ping($host, $timeout = 1, $verbose = false)
{
/**
* Return vždy vrací False ale pro příchod paketu ECHO_REPLAY
* jinak vrací čas odezvy PING. Tento script musí běžet
* pod ROOTem, jinak není možné přistupovat k RAW socketu!
* @param string hostname or IP address
* @param int timeout
* @param bool verbose output
* @return double
*/
# vytvoří síťový socket pro RAW zápis,
# AF_INET => protokol IPV4
# SOCK_RAW => poskytne možnost manuálně vytvořit libovolnou konstrukci paketu
$socket = socket_create(AF_INET, SOCK_RAW, 1);
# Nastaví Tmeout a připojí se k danému "hostu".
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array(
'sec' => $timeout,
'usec' => 0
));
socket_connect($socket, $host, null);
# Hlavičk ECHO REQUERS v hex \x08
$header = "\x08\x00\x7d\x4b\x00\x00\x00\x00PingHost";
$start = microtime(true);
socket_send($socket, $header, strLen($header), 0);
if ($result = socket_read($socket, 255)) {
// Je odpoved Echo Replay? (ping odpovedel?)
if (substr($result, 0, 1) == "E") {
# Verbose? Zobraz víc info
echo $verbose ? sprintf('%s bytes from %s time=%s ms',
strLen($header), $host, ((100 * (microtime(true) - $start)))) : '';
# Uzavře soket
socket_close($socket);
# Vrať čas
return microtime(true) - $start;
} else {
//Odpoved přišla, ale né ECHO_REPLAY, tedy např. DEST UNRECHABLE atp.
echo $verbose ? sprintf('ICMP Unrechable %s time=%s ms',
$host, ((100 * (microtime(true) - $start)))) : '';
socket_close($socket);
return False;
}
} else {
echo $verbose ? sprintf('ICMP Timeout %s time=%s ms',
$host, ((100 * (microtime(true) - $start)))) : '';
socket_close($socket);
return False;
}
}
# Příklad použití timeeout 1 sec, verbose výpis
php_ping('195.47.235.1', 1, True);
# Příklad pouhého zobrazení času pingu (případně "False")
echo php_ping('www.seznam.cz');
?>
Výstup
Pokud PHP spustím v shellu, vypadá výstup posledních dvou příkladů následovně:
/usr/bin/php5 ping.php
root@SVT:/usr/local/bin# ./ping.php
16 bytes from 195.47.235.1 time=0.9033203125 ms
0.0066969394683838
root@SVT:/usr/local/bin#
Samozřejmě že moje implementace je velice primitivní a obsahuje opravdu jen to nejnutnější, nicméně pro někoho toto může být
dostatečné, případně může být návodem jak dál postupovat a funkci zlepšit.
Pokud by se našel někdo, kdo funkci vylepší, budu rád za zaslání – mohu můj zápisek vylepšit a rozšířit.
Podobné články:
Arduino a RC vysílačka 9.12.2014
Arduino a krokový motor potřetí 20.11.2014
Arduino a motor 28BYJ-48 podruhé 17.11.2014
Arduino - řízení krokového motoru 11.11.2014
Štítky tohoto článku:
php
ping
programovani
Diskuze: Implementace ICMP Pingu v PHP
Vaše jméno
Váš email
WEB
(povinné)
(nebude zveřejněn, povinný)
(bude zveřejněn, pište s http://)
Text vzkazu:
Kolik je 3×2? (ochrana proti spamu)
Vložit příspěvek
PDF vygenerováno 27.9.2016 10:24:55 z webu http://nul.cz.
URL dokumentu je http://nul.cz/site/pure-php-ping/
Podobné dokumenty
Arduino - řízení krokového motoru
Ahoj, moc hezky to máš popsané. :) Jen bych se chtěl zeptat, co znamená ta změna rozsahu, jak se definuje ta
proměnná motorspeed? Jak vůbec funguje řízení rychlosti otáčení motorku? Děkuji :)
Reago...
Hacking, cracking a warez
Přístup k počítačové technologii pro všechny bez rozdílu a zdarma
Všechny informace zdarma
Nedůvěra vládě (obecně autoritám) a podpora decentralizace
Hackeři mají být posuzováni podle jejich dovedn...
AIR FREIGHT December 2011
získali určitou sebejistotu. Světový obchod stagnuje, zatímco letecké objemy FTK (Freight Ton
Kilometer) strmě padají, což dokazuje, že cargo se nyní přepravuje jiným způsobem.
Cargo sazby pokrač...
Nástroje CASE v řízení projektu
EPM pro týmovou spolupráci. Pro ukládání, stahování a práci s daty
na serveru Project Server používají uživatelé aplikaci Project
Professional nebo portál Project Web Access.
Jak na akordové značky
jediným tónem, a to právě onou tercií (3).
2. Symboly „+“ a „-“ jsou totožné se symboly „#“ a „b“, tedy zvyšují nebo snižují uvedený
interval o půl tón.
3. Symbol „maj7“ značí, že v akordu je použi...
Semestrální práce Semestrální práce
Vycházíme z obecného předpisu tabulky, jejichž parametry podléhají rovnicím:
mám hlad, mám chuť. cukrovka a jídlo
Já a chuť – to by byl dalekosáhlý román. Ale stručně: S cukrovkou jsem se naučila žít celkem
normální život. Jelikož jsem často v hypu, můžu si dovolit jíst vlastně vše, na co mám chuť.
Nejhorší je...
JavaScript pro lenochy efektivně
Lekce ze základní školy
„Matematik či programátor musí být líný a
přesný.“
líný přístup = řešit problémy efektivně
přesnost = pište testy!
X36DSA 2005