<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Advanced Programming Stories &#187; ping</title>
	<atom:link href="http://developstories.gr/tag/ping/feed/" rel="self" type="application/rss+xml" />
	<link>http://developstories.gr</link>
	<description>advanced web development techniques &#38; reverse engineering stories</description>
	<lastBuildDate>Tue, 27 Jul 2010 12:57:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>PHP ping</title>
		<link>http://developstories.gr/php/php-ping/</link>
		<comments>http://developstories.gr/php/php-ping/#comments</comments>
		<pubDate>Fri, 30 Jan 2009 10:31:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[php ping]]></category>
		<category><![CDATA[ping]]></category>

		<guid isPermaLink="false">http://developstories.gr/?p=70</guid>
		<description><![CDATA[Σε ένα απο τα τελευταία projects που ασχολούμαι στην NetWerk, η εφαρμογή μου επικοινωνεί με web services που βρίσκονται σε άλλους servers, ωστόσο για την αποφυγή λαθών και για καλύτερο debugging ήθελα να κάνω ping τον server που &#8220;μιλάω&#8221; ωστε να ξέρω τι συμβαίνει.
Πώς κάνουμε ping με php
Επειδή γενικώς δέν μου αρέσει να ανακαλύπτω τον [...]]]></description>
			<content:encoded><![CDATA[<p>Σε ένα απο τα τελευταία projects που ασχολούμαι στην <a href="http://www.netwerk.gr/">NetWerk</a>, η εφαρμογή μου επικοινωνεί με web services που βρίσκονται σε άλλους servers, ωστόσο για την αποφυγή λαθών και για καλύτερο debugging ήθελα να κάνω ping τον server που &#8220;μιλάω&#8221; ωστε να ξέρω τι συμβαίνει.</p>
<h3>Πώς κάνουμε ping με php</h3>
<p>Επειδή γενικώς δέν μου αρέσει να ανακαλύπτω τον τροχό κάθε φορά που κάνω κάτι καινούριο, έψαξα στο internet και ανακάλυψα ένα code snippet για <a href="http://birk-jensen.dk/articles/php/ping/ping.php">ping μέσω php</a>. Το μόνο πρόβλημα, είναι πως εφόσον o server που κάνουμε ping δέν απαντήσει, το scriptάκι κολλάει. Παρακάτω είναι μία αλλαγμένη έκδοση του snippet οπου ορίζεις το timeout.</p>
<pre class="brush: php;">

&lt;?php

//add
function microtime_float() {
list($usec, $sec) = explode(&quot; &quot;, microtime());
return ((float)$usec + (float)$sec);
}

// Checksum calculation function
function icmpChecksum($data) {
if (strlen($data)%2)
$data .= &quot;\x00&quot;;

$bit = unpack('n*', $data);
$sum = array_sum($bit);

while ($sum &gt;&gt; 16)
$sum = ($sum &gt;&gt; 16) + ($sum &amp;amp; 0xffff);

return pack('n*', ~$sum);
}

// Making the package
$type= &quot;\x08&quot;;
$code= &quot;\x00&quot;;
$checksum= &quot;\x00\x00&quot;;
$identifier = &quot;\x00\x00&quot;;
$seqNumber = &quot;\x00\x00&quot;;
$data= &quot;Scarface&quot;;
$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);
if (socket_connect($socket, $argv[1], null)) {

socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array(&quot;sec&quot;=&gt;5, &quot;usec&quot;=&gt;0)); // thek add

// 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); // thek remove
$startTime = microtime_float(); // thek add

socket_send($socket, $package, strLen($package), 0);
if (socket_read($socket, 255)) {
//echo round(microtime(true) - $startTime, 4) .' seconds'; // thek remove
echo round(microtime_float() - $startTime, 4) .' seconds'; // thek add
}
else {
echo 'lost connection';
}
socket_close($socket);
}
else {
echo 'lost connection';
}
?&gt;
</pre>
<p>Στο παραπάνω παράδειγμα το timeout θα γίνει σε 5 δευτερόλεπτα. Αν θέλετε να το αλλάξετε απλώς αλλάξτε το 5 στην παρακάτω γραμμή:</p>
<p>socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array(&#8220;sec&#8221;=&gt;5, &#8220;usec&#8221;=&gt;0)); // thek add</p>
<p>Το script τρέχει μόνο απο CLI δίνοντας την εντολή</p>
<p>php -q script.php &lt;ip address&gt;</p>
<p>όπου script.php είναι το παρών σκριπτάκι και &lt;ip_address&gt; είναι η διεύθυνση που θέλετε να κάνετε ping. Σε επόμενο άρθρο θα γράψω πώς να το κάνετε απο web εφαρμογή.</p>
]]></content:encoded>
			<wfw:commentRss>http://developstories.gr/php/php-ping/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
