[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Прошу помочь с PHP кодом
Гость_Дмитрий
У меня есть скрипт для запроса и обработки данных с сервера. Вопрос вот в чём (заранее прошу извинить, моё знание PHP сводится к знанию команд if, else, return, echo и всё): Судя по коду, здесь куда-то нужно вписать IP и Port сервера, к которому идёт запрос. Так вот, куда его нужно вписывать? Заранее благодарен.

<?
$sock = NULL;
$errno = 0;
$errstr = '';
$raw = ''; // raw data string
$data = array(); // array of parsed data from a query
$ping = 0; // response time from last command sent/recv
$plrstr = 'U';
$halflife_version = 1; // 0 = unknown version
$infostr = 'TSource Engine Query'.chr(0);
$rulestr = 'V';
$pingstr = 'i';
$challenge = 'W';

function query_info($ip, $port)
{
global $infostr;
if (!$ip) return FALSE;
$start = _getmicrotime();
$raw = _sendquery($ip, $port, $infostr);
$end = _getmicrotime();
if (!$raw) return FALSE;
$data = array(); // query_info always resets the data array (so call this before other queries)
if ($raw != '')
{
$data['ping'] = ceil(($end - $start) * 1000); // return the time (ms) it took for the packet to return (ping)
$data['ip']=$ip;
$data['port']=$port;
$data=_parse_info_halflife1($raw);
return $data;
}
return FALSE;
}

function _parse_info_halflife1($raw) {
$raw = substr($raw, 5); // strip off response header bytes
$data['int_ipport']=_getnullstr($raw);
list($data['int_ip'], $data['int_port'])= explode(':', $data['int_ipport']);
$data['name']= _getnullstr($raw);
$data['map']= _getnullstr($raw);
$data['gamedir']= _getnullstr($raw);
$data['gamename']= _getnullstr($raw);
$data['totalplayers']= _getbyte($raw);
$data['maxplayers']= _getbyte($raw);
$data['protocol']= _getbyte($raw); // 47
$data['servertype']= _getchar($raw);
$data['serveros']= _getchar($raw);
$data['serverlocked']= _getbyte($raw);
$data['modrunning']= _getbyte($raw);
$data['modurl']= $data['modrunning'] ? _getnullstr($raw) : '';
$data['modftp']= $data['modrunning'] ? _getnullstr($raw) : '';
_getnullstr($raw);
$data['modver']= _getshort($raw) . '.' . _getshort($raw);
$data['modsize']= _getlong($raw);
$data['modserveronly']= _getbyte($raw);
$data['modclientdll']= _getbyte($raw);
return $data;
}

// The sub-class must always contain this method to query the active players list
function query_players($ip, $port)
{
global $plrstr;
$raw =_sendquery($ip, $port, $plrstr.query_challenge($ip, $port));
if (!$raw) return FALSE;
if (!empty($raw))
{
$raw = substr($raw, 5); // strip off response header bytes
$data['activeplayers']= _getbyte($raw);
$data['players']= array();
for ($i=1; $i <= $data['activeplayers']; $i++)
{
if ($raw == '') break;
$data['players'][] = array('id'=> _getbyte($raw),
'name'=> _getnullstr($raw),
'kills'=> _getlong($raw),
'onlinetime'=> (int)_getfloat($raw));
}
$data['activeplayers'] = count($data['players']);
return $data;
}
return FALSE;
}

function query_ping($ip, $port) {
global $pingstr;
if (!$ip) return FALSE;
$start = _getmicrotime();
$raw=_sendquery($ip, $port, $pingstr);
$end = _getmicrotime();
if ($raw == '')
{
return FALSE;
}
else
{
return ($end - $start) * 1000;
}
}


function _sendquery($ip, $port, $cmd) {
global $DEBUG;
if (!$port) $port = '27015';
$retry = 0;
$oldmqr = get_magic_quotes_runtime();
$sock=_connectsocket($ip, $port);
if (!$sock)
{
trigger_error("Failed to connect to socket on $ip:$port", E_USER_WARNING);
return FALSE;
}
$packets = array(); // stores each packet seperately, so we can combine them afterwards
$command = pack("N", 0xFFFFFFFF) . $cmd; # . pack('x');
$raw = "";

if ($oldmqr) set_magic_quotes_runtime(0);
if ($DEBUG) print "DEBUG: Sending query to $ip:$port:\n" . hexdump($command) . "<br>";
fwrite($sock, $command, strlen($command));
$expected = 0;
do {
$packet = fread($sock, 1500);
if (strlen($packet) == 0)
{
$retry++;
if ($DEBUG) print "DEBUG: Resending query $ip:$port:\n" . hexdump($command) . "<br>";
fwrite($sock, $command, strlen($command));
$expected = 1;
continue;
}

if ($DEBUG) print "DEBUG: Received " . strlen($packet) . " bytes from $ip:$port:\n" . hexdump($packet) . "<br>";

$header = substr($packet, 0, 4); // get the 4 byte header
$ack = @unpack("N1split", $header);
$split = sprintf("%u", $ack['split']);
if ($DEBUG) print "DEBUG: ACK = " . sprintf("0x%X", $ack['split']) . "\n";
if ($split == 0xFeFFFFFF)
{ // we need to deal with multiple packets
$packet = substr($packet, 4); // strip off the leading 4 bytes
$header = substr($packet, 0, 5); // get the 'sub-header ack'
$packet = substr($packet, 5); // strip off 32bit int ID, seq# and total packet#
$info = @unpack("N1id/C1byte", $header); // we don't really care about the ID
if ($DEBUG) printf("DEBUG: Sub ACK: %X (%08b)\n", $info['byte'], $info['byte']);
if (!$expected) $expected = $info['byte'] & 0x0F; // now we know how many packets to receive
$seq = (int)($info['byte'] >> 4); // get the sequence number of this packet
$packets[$seq] = $packet; // store the packet
$expected--;
}
elseif ($split == 0xFFFFFFFF)
{
$packets[0] = $packet;
$expected = 0;
}
}

while ($expected and $retry < maxretries());

fclose($sock);
if ($oldmqr) set_magic_quotes_runtime(1);
ksort($packets, SORT_NUMERIC);
$raw = implode('', $packets); // glue the packets together to make our final data string
return $raw ;
}

function query_challenge($ip, $port) {
global $challenge;
if (!$ip) return FALSE;
$raw = _sendquery($ip, $port, $challenge);
if (!$raw) return FALSE;
if (!empty($raw)) {
return substr($raw,5,5);
}
return "";
}

function maxretries() {
return $retries >= 0 ? $conf['retries'] : 0;
}

function _connectsocket($ip, $port, $proto='udp')
{
global $DEBUG, $timeout, $errno, $errstr;
if ($DEBUG) print "DEBUG: Opening socket to $ip:$port >>><br>";
$sock = @fsockopen("$proto://$ip", $port, $errno, $errstr);
_set_timeout($timeout);
return $sock;
}

function _set_timeout($seconds=5, $sock=NULL) {
if (!$sock) $sock =& $sock;
if (!$sock) return;
if (function_exists('stream_set_timeout')) { // PHP >= 4.3.0
stream_set_timeout($sock, $seconds);
} elseif (function_exists('socket_set_timeout')) { // this function is deprecated
socket_set_timeout($sock, $seconds);
}
}


// reads a null terminated string from the raw input
function _getnullstr(&$raw) {
if (empty($raw)) return '';
$end = strpos($raw, "\0"); // find position of first null byte
$str = substr($raw, 0, $end); // extract the string (excluding null byte)
$raw = substr($raw, $end+1); // remove the extracted string (including null byte)
return $str; // return our str (no null byte)
}

// reads a character from the raw input
function _getchar(&$raw) {
return sprintf("%c", _getbyte($raw));
}

// reads a byte from the raw input
function _getbyte(&$raw)
{
if (empty($raw)) return '';
$byte = substr($raw, 0, 1);
$raw = substr($raw, 1);
return ord($byte);
}

// reads a short integer/word (2 bytes) from the raw input
function _getshort(&$raw) {
if (empty($raw)) return '';
$lo = _getbyte($raw);
$hi = _getbyte($raw);
$short = ($hi << 8) | $lo;
return $short;
}

// reads a long integer (4 bytes) from the raw input
function _getlong(&$raw) {
if (empty($raw)) return '';
$lo = _getshort($raw);
$hi = _getshort($raw);
$long = ($hi << 16) | $lo;
return $long;
}

function _getfloat(&$raw) {
if (empty($raw)) return '';
$f = @unpack("f1float", $raw);
$raw = substr($raw, 4);
return $f['float'];
}

function _getmicrotime()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}

function _unpack($type, $data)
{
$ary = @unpack($type . '1value', $data);
return $ary['value'];
}

function hexdump($string, $maxwidth=16) {
$output = "";
$curwidth = 1;
$bytes = array();
for ($i=0; $i<strlen($string); $i++) {
$byte = ord($string[$i]);
$bytes[] = $byte;
$output .= sprintf("%02X ", $byte);
if ($i+1 == strlen($string) and $curwidth != $maxwidth)
{
$padlen = ($maxwidth * 3) - (count($bytes) * 3);
$output .= sprintf("%-{$padlen}s", " ");
$curwidth = $maxwidth;
}
if ($curwidth >= $maxwidth)
{
$output .= " ";
foreach ($bytes as $b)
{
if ($b <= 32 or $b >= 127)
{
$output .= ".";
} else {
$output .= chr($b);
}
}

$bytes = array();
$output .= "\n";
$curwidth = 1;
}
else
{
$curwidth++;
}
}

return $output;
}
$server="10.10.0.252"; $port="27015";
$data=query_info($server, $port);
$players=query_players($server, $port);

if ($data['serveros']=="l") { $data['serveros']="Linux"; } else { $data['serveros']="Windows"; }
if ($data['serverlocked']=="0") { $data['serverlocked']="Нет"; } else { $data['serverlocked']="Да"; }
if ($data['modrunning']=="0") { $data['modrunning']="Незагружен"; } else { $data['modrunning']="Загружен"; }

//if ($data['modserveronly']){
if (file_exists("./maps/".$data['map'].".jpg")){
$show_map="<img src=\"maps/".$data['map'].".jpg\" width=\"150\" alt=\"Карта ".$data['map']."\" title=\"Карта ".$data['map']."\" />";
} else $show_map="<img src=\"maps/map_not_dir.jpg\" width=\"150\" alt=\"Карта не найдена\" title=\"Карта не найдена\" />";
//} else $show_map="<img src=\"/images/map/cs/map_not.jpg\" width=\"150\" alt=\"Нет соединения\" title=\"Нет соединения\" />";
$content .= "
<table width=
\"99%\" cellpadding=\"1\" cellspacing=\"1\" align=\"center\">
<tr><td align=
\"right\"><b>Имя сервера</b></td><td align=\"center\">".$data['name']."</td><td align=\"center\" rowspan=\"8\">".$show_map."</td></tr>
<tr><td align=
\"right\"><b>Карта</b></b></td><td align=\"center\">".$data['map']."</td></tr>
<tr><td align=
\"right\"><b>Игра</b></td><td align=\"center\">".$data['gamename']."</td></tr>
<tr><td align=
\"right\"><b>Адрес</b></td><td align=\"center\">".$data['int_ipport']."</td></tr>
<tr><td align=
\"right\"><b>Игроков / Макс</b></td><td align=\"center\">".$data['totalplayers']." / ".$data['maxplayers']."</td></tr>
<tr><td align=
\"right\"><b>Пинг</b></td><td align=\"center\">".round(query_ping($server, $port))."</td></tr>
<tr><td align=
\"right\"><b>Общий</b></td><td align=\"center\">".$data['serverlocked']."</td></tr>
<tr><td align=
\"right\"><b>MOD</b></td><td align=\"center\">".$data['modrunning']."</td></tr>
</table><br />
"
;

$content .= "<table cellspacing=1 cellpadding=2 width='50%' align='center'><tr><td align=center>№</td><td align=center>Имя</td><td align=center>Фрагов</td><td align=center>В игре</td></tr> ";
if ($players['activeplayers'] > '0')
{
for ($i=0; $i<$players['activeplayers']; $i++) {
$timeonline=date("i:s",$players['players'][$i]['onlinetime']);
$content .= "<tr><td align=center>".$players['players'][$i]['id']."</td><td align=center>".$players['players'][$i]['name']."</td><td align=center>".$players['players'][$i]['kills']."</td><td align=center>".$timeonline."</td></tr>";
}
}

else
{
$content .= "<td colspan='4' align='center'><b>Сервер в данный момент пуст!</b></td></tr>";
}
$content .= "</table>";
print $content;
?>




Спустя 2 минуты, 56 секунд (29.09.2011 - 15:40) linker написал(а):
Ищи строки
$server="10.10.0.252"; $port="27015";
$data=query_info($server, $port);
$players=query_players($server, $port);
теперь видишь где и что нужно подставить?

Спустя 8 минут, 27 секунд (29.09.2011 - 15:48) Гость_Дмитрий написал(а):
linker, спасибо большое)) оказывается проблема была не в незнании PHP, а в фиговом зрении))

Спустя 26 минут, 33 секунды (29.09.2011 - 16:15) Гость_Дмитрий написал(а):
Вот только почему-то ничего не пашет sad.gif

Спустя 2 минуты, 49 секунд (29.09.2011 - 16:17) Игорь_Vasinsky написал(а):
может и ошибки какие нить вылазят.

поставь вначале скрипта

error_reporting(E_ALL);

Спустя 58 минут, 45 секунд (29.09.2011 - 17:16) Гость_Дмитрий написал(а):
А где эти ошибки посмотреть? Я просто скрипт пользую, как модуль для Limbo...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.