note 112063 added to function.fsockopen
| From: | CharlesTorvalds | Date: | Sun, 28 Apr 2013 17:06:23 +0000 |
| Subject: | note 112063 added to function.fsockopen | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-194648@lists.php.net to get a copy of this message | ||
Rewrite/Update of king dot macro's DNS lookups function.
<?php
function gethostbyaddr_timeout( $ip, $dns, $timeout = 3 ) {
// src: http://www.askapache.com/php/php-fsockopen-dns-udp.html
// random transaction number (for routers etc to get the reply back)
$data = rand( 10, 77 ) . "\1\0\0\1\0\0\0\0\0\0";
// octals in the array, keys are strlen of bit
$bitso = array("","\1","\2","\3" );
foreach( array_reverse( explode( '.', $ip ) ) as $bit ) {
$l=strlen($bit);
$data.="{$bitso[$l]}".$bit;
}
// and the final bit of the request
$data .= "\7in-addr\4arpa\0\0\x0C\0\1";
// create UDP socket
$errno = $errstr = 0;
$fp = fsockopen( "udp://{$dns}", 53, $errno, $errstr, $timeout );
if( ! $fp || ! is_resource( $fp ) )
return $errno;
if( function_exists( 'socket_set_timeout' ) ) {
socket_set_timeout( $fp, $timeout );
} elseif ( function_exists( 'stream_set_timeout' ) ) {
stream_set_timeout( $fp, $timeout );
}
// send our request (and store request size so we can cheat later)
$requestsize = fwrite( $fp, $data );
$max_rx = $requestsize * 3;
$start = time();
$responsesize = 0;
while ( $rxed < $max_rx && ( ( time() - $start ) < $timeout ) && ($b = fread(
$fp, 1 ) ) !== false ) {
$responsesize++;
$response .= $b;
}
echo "[tx: $requestsize bytes] [rx: {$responsesize} bytes]";
// hope we get a reply
if ( is_resource( $fp ) )
fclose( $fp );
// if empty response or bad response, return original ip
if ( empty( $response ) || bin2hex( substr( $response, $requestsize + 2, 2 ) ) !=
'000c' )
return $ip;
// set up our variables
$host = '';
$len = $loops = 0;
// set our pointer at the beginning of the hostname uses the request size from earlier rather than
work it out
$pos = $requestsize + 12;
do {
// get segment size
$len = unpack( 'c', substr( $response, $pos, 1 ) );
// null terminated string, so length 0 = finished - return the hostname, without the trailing .
if ( $len[1] == 0 )
return substr( $host, 0, -1 );
// add segment to our host
$host .= substr( $response, $pos + 1, $len[1] ) . '.';
// move pointer on to the next segment
$pos += $len[1] + 1;
// recursion protection
$loops++;
}
while ( $len[1] != 0 && $loops < 20 );
// return the ip in case
return $ip;
}
?>
----
Server IP: 69.147.83.199
Probable Submitter: 24.123.218.181
----
Manual Page -- http://php.net/manual/en/function.fsockopen.php
Edit -- https://master.php.net/note/edit/112063
Del: integrated -- https://master.php.net/note/delete/112063/integrated
Del: useless -- https://master.php.net/note/delete/112063/useless
Del: bad code -- https://master.php.net/note/delete/112063/bad+code
Del: spam -- https://master.php.net/note/delete/112063/spam
Del: non-english -- https://master.php.net/note/delete/112063/non-english
Del: in docs -- https://master.php.net/note/delete/112063/in+docs
Del: other reasons-- https://master.php.net/note/delete/112063
Reject -- https://master.php.net/note/reject/112063
Search -- https://master.php.net/manage/user-notes.php