我想检查quake3游戏服务器是在线还是离线。如果处于脱机状态,则回显“服务器处于脱机状态”;如果处于联机状态,则回显“服务器处于联机状态”。
我正在使用this库:
正如您在库中看到的那样,我已经有一个 isOnline 函数,我认为该服务器是在线的还是不在线的!但我不知道如何输出。
调用游戏服务器数据:
<?php
include 'test/GameServerQuery.php';
$data = GameServerQuery::queryQuake3('1.1.1.1', 28960);
echo 'Hostname: ' . $data['sv_hostname'] . '<br />';
echo 'Players online: ' . $data['sv_maxclients'] . '<br />'; /// How can I count online players / maxclients? ex.: 0/20
echo 'Punkbuster: ' . $data['sv_punkbuster'] . '<br />';
?>
以下是库中的相关代码(以防链接消失或更改):
public static function isOnline ($host, $port, $type)
{
if ($type == 'minecraft') { // No need for the full ping
return @fclose (@fsockopen ( $host , $port , $err , $errstr , 2 ));
}
if (method_exists('GameServerQuery', 'query'.$type)) {
return self::{'query'.$type}($host , $port);
}
return @fclose (@fsockopen ( $host , $port , $err , $errstr , 2 ));
}
public static function queryQuake3($host, $port)
{
$reponse = self::ping($host, $port, "\xFF\xFF\xFF\xFFgetstatus\x00");
if ($reponse === false || substr($reponse, 0, 5) !== "\xFF\xFF\xFF\xFFs") {
return false;
}
$reponse = substr($reponse, strpos($reponse, chr(10))+2);
$info = array();
$joueurs = substr($reponse, strpos($reponse,chr(10))+2);
$reponse = substr($reponse, 0, strpos($reponse, chr(10)));
while($reponse != ''){
$info[self::getString($reponse, '\\')] = self::getString($reponse, '\\');
}
if (!empty($joueurs)) {
$info['players'] = array();
while ($joueurs != ''){
$details = self::getString($joueurs, chr(10));
$info['players'][] = array('frag' => self::getString($details, ' '),
'ping' => self::getString($details, ' '),
'name' => $details);
}
}
return $info;
}
private static function ping($host, $port, $command)
{
$socket = @stream_socket_client('udp://'.$host.':'.$port, $errno, $errstr, 2);
if (!$errno && $socket) {
stream_set_timeout($socket, 2);
fwrite($socket, $command);
$buffer = @fread($socket, 1500);
fclose($socket);
return $buffer;
}
return false;
}
private static function getString(&$chaine, $chr = "\x00")
{
$data = strstr($chaine, $chr, true);
$chaine = substr($chaine, strlen($data) + 1);
return $data;
}
答案 0 :(得分:1)
这是一个静态函数,就像您已经在调用的函数一样。我想像这样的事情会做的:
$result = GameServerQuery::isOnline('1.1.1.1', 28960, "Quake3");
print_r($result);
这将告诉您获得什么结果。我怀疑它实际上与queryQuake3函数相同,因为如果您将“ Quake3”指定为最后一个参数,则isOnline函数将仅调用“ queryQuake3”函数并将结果直接传递回去。
因此,如果服务器处于脱机状态或无响应,则该函数应返回false
,如果服务器处于联机状态,则应返回true
,或者返回更复杂的数据集。
所以实际上我认为您可以写:
$result = GameServerQuery::isOnline('1.1.1.1', 28960, "Quake3");
if ($result === false) {
echo "Server is offline";
}
else {
echo "Server is online";
}