GameServerQuery如何检查服务器是否在线并计数在线玩家?

时间:2019-11-18 15:00:32

标签: php

我想检查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;
}

1 个答案:

答案 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";
}