Skip to content

Instantly share code, notes, and snippets.

@Emiel45
Last active March 3, 2018 18:16
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Emiel45/7647029 to your computer and use it in GitHub Desktop.
Save Emiel45/7647029 to your computer and use it in GitHub Desktop.
Minecraft 1.7 server list pinged (hacked together in 20 minutes)
<?php
// Info used: http://wiki.vg/Server_List_Ping
// (Original varint parsing: https://gist.github.com/thinkofname/e975ddee04e9c87faf22)
// Reads a varint from the socket
function read_varint($socket) {
$i = 0; $j = 0;
while(true) {
socket_recv($socket, $buf, 1, null);
$k = ord($buf[0]);
$i |= ($k & 0x7F) << $j++ * 7;
if ($j > 5) return -1;
if (($k & 0x80) != 128) break;
}
return $i;
}
// Writes a varint to the socket
function write_varint($socket, $val) {
while(true) {
if(($val & 0xFFFFFF80) == 0) {
socket_send($socket, chr($val), 1, null);
return;
}
socket_send($socket, chr($val & 0xFF | 0x80), 1, null);
$val >>= 7;
}
}
// Used to ping a 1.7+ minecraft server
function ping_mcserver($server, $port = 25565){
// Create socket and connect
$socket = socket_create(AF_INET,SOCK_STREAM, getprotobyname('tcp'));
socket_connect($socket, $server, $port);
// Calculate size of packet
write_varint($socket, 6 + strlen($server));
{
// Handshake packet
socket_send($socket, chr(0), 1, null);
// Protocol version
socket_send($socket, chr(4), 1, null);
// Server address
write_varint($socket, strlen($server));
socket_send($socket, $server, strlen($server), null);
// Server port (big endian)
socket_send($socket, chr(($port >> 8) & 0xff), 1, null);
socket_send($socket, chr($port & 0xff), 1, null);
// Next state is status state
write_varint($socket, 1);
}
// Size of packet
write_varint($socket, 1);
{
// Status request packet
socket_send($socket, chr(0), 1, null);
}
// Read packet size (unsused)
read_varint($socket);
// Read opcode, should be 0 for status resposne
socket_recv($socket, $buf, 1, null);
// Read JSON string length
$len = read_varint($socket);
// Read JSON string
socket_recv($socket, $buf, $len, null);
// Decode JSON string
return json_decode($buf, true);
}
// Dumps json string:
// print_r(ping_mcserver("server.com"));
// Example usage
$info = ping_mcserver("server.com");
print('<img src="' . $info['favicon'] . '"/><br />');
print('<b>Title: </b>' . $info['description']['text'] . '<br />');
print('<b>Players: </b>' . $info['players']['online'] . '/' . $info['players']['max'] . '<br />');
print('<b>Version: </b>' . $info['version']['name'] . '<br />');
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment