Implementace ICMP Pingu v PHP

Transkript

Implementace ICMP Pingu v PHP
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

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...

Více

Hacking, cracking a warez

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...

Více

AIR FREIGHT December 2011

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č...

Více

Nástroje CASE v řízení projektu

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.

Více

Jak na akordové značky

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...

Více

Semestrální práce Semestrální práce

Semestrální práce Semestrální práce Vycházíme z obecného předpisu tabulky, jejichž parametry podléhají rovnicím:

Více

mám hlad, mám chuť. cukrovka a jídlo

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...

Více

JavaScript pro lenochy efektivně

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!

Více