我不知道它为什么有效,但它似乎适用于stream_socket_client
. 显然不是
$ip = "173.208.81.98";
$port = 27015;
if(@stream_socket_client("tcp://$ip:$port") !== false) {
echo 'online';
} else {
echo 'offline';
}
E:
https://developer.valvesoftware.com/wiki/Server_queries
有一个可以发送到服务器的命令列表。但是没有在线选项。我认为您仍然需要检查 stream_socket_client 是否为假。如果为假,则服务器肯定已关闭。有可能您可以访问服务器,但它被列为不可用。我不知道 Valve 是如何处理这些事情的。我注意到它与 firepoweredgaming.com 上的列表不一致。
所以,基本上以下内容并不适合你。但也许你可以使用它。
function server($ip, $port) {
$command = "\377\377\377\377TSource Engine Query\0";
$socket = stream_socket_client("udp://$ip:$port");
fwrite($socket, $command); // Send the command
$JunkHead = fread($socket,4);
fread($socket, 1); // Always equal to 0x49, Header chunk
$return['protocol'] = ord(fread($socket, 1));
$return['name'] = getNextString($socket);
$return['map'] = getNextString($socket);
$return['folder'] = getNextString($socket);
$return['game'] = getNextString($socket);
$return['id'] = ord(fread($socket, 2));
$return['players'] = ord(fread($socket, 1));
$return['max_players'] = ord(fread($socket, 1));
$return['bots'] = ord(fread($socket, 1));
$return['server_type'] = fread($socket, 1); // [d]edicated, [l] non-dedicated, [p] SourceTV
$return['environment'] = fread($socket, 1); // [l]inux, [w]indows or [m]ac
$return['visibility'] = ord(fread($socket, 1)); // 1==private
$return['vac'] = ord(fread($socket, 1)); // 1==secure
$return['version'] = getNextString($socket);
return $return;
}
/**
* freads until \0 is found. Nullterminated string.
*/
function getNextString($socket) {
$str = '';
while(($read = fread($socket, 1)) != "\0") {
$str .= $read;
}
return $str;
}
我有一个名为 server 的函数,它将数据读入一个数组。(您可以使用 打印它print_r(server('173.208.81.98', 27015))
)。我曾经ord()
从 ascii 中获取数字,因为 php 将套接字读取为 ascii。