Skip to content

Instantly share code, notes, and snippets.

@jhead
Last active December 20, 2015 02:29
Show Gist options
  • Save jhead/6057224 to your computer and use it in GitHub Desktop.
Save jhead/6057224 to your computer and use it in GitHub Desktop.
<?php
function pingNetwork($hostname, $port = 25565) {
$packet = "\xFE\x01";
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
try {
$sConnectStatus = @socket_connect($socket, $hostname, $port);
if (!$sConnectStatus) return false;
$sWriteStatus = @socket_write($socket, $packet, strlen($packet));
if (!$sConnectStatus) return false;
$rHeader = @socket_read($socket, 3, PHP_BINARY_READ);
$rPacketID = $rHeader[0];
if ($rPacketID != "\xFF") return false;
$rPayloadSize = unpack("n", substr($rHeader, 1));
$rPayloadSize = $rPayloadSize[0];
$rPayload = "";
socket_read($socket, 6);
while (($b = socket_read($socket, 1)) !== "") {
$rPayload .= $b;
}
$rPayload = explode("\x00\x00", $rPayload);
$sProto = $rPayload[0];
$sVersion = $rPayload[1];
$sRawMessage = $rPayload[2];
$sMessage = "";
for ($i = 0; $i < strlen($sRawMessage); $i++) {
$char = $sRawMessage[$i];
$nextChar = ($i + 1 < strlen($sRawMessage) ? $sRawMessage[$i + 1] : null);
if ($char == "\x00" && $nextChar == "\xa7") {
$i += 3;
} else {
$sMessage .= $char;
}
}
$sPlayers = $rPayload[3];
$sPlayers = intval(str_replace("\x00", "", $sPlayers));
return array(
"version" => array(
"protocol" => $sProto,
"client" => $sVersion
),
"motd" => $sMessage,
"players" => $sPlayers
);
} catch (Exception $ex) {
return false;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment