Skip to content

Instantly share code, notes, and snippets.

@Emiel45
Created December 29, 2013 16:03
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Emiel45/8171871 to your computer and use it in GitHub Desktop.
Save Emiel45/8171871 to your computer and use it in GitHub Desktop.
Rust server ping
package me.mast3rplan.rust.ping;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
public class RustPing {
static class ServerData {
int protocol;
String name;
String map;
String folder;
String game;
int id;
int players;
int maxPlayers;
int bots;
char type;
char environment;
boolean passworded;
boolean vac;
String version;
int gamePort;
long steamId;
String keywords;
long gameId;
long appId;
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("ServerData{");
sb.append("protocol=").append(protocol);
sb.append(", name='").append(name).append('\'');
sb.append(", map='").append(map).append('\'');
sb.append(", folder='").append(folder).append('\'');
sb.append(", game='").append(game).append('\'');
sb.append(", id=").append(id);
sb.append(", players=").append(players);
sb.append(", maxPlayers=").append(maxPlayers);
sb.append(", bots=").append(bots);
sb.append(", type=").append(type);
sb.append(", environment=").append(environment);
sb.append(", passworded=").append(passworded);
sb.append(", vac=").append(vac);
sb.append(", version='").append(version).append('\'');
sb.append(", gamePort=").append(gamePort);
sb.append(", steamId='").append(steamId).append('\'');
sb.append(", keywords='").append(keywords).append('\'');
sb.append(", gameId=").append(gameId);
sb.append(", appId=").append(appId);
sb.append('}');
return sb.toString();
}
}
public static void main(String[] args) throws Exception {
byte[] pingPayload = new byte[]{
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
0x54, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20,
0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x20, 0x51,
0x75, 0x65, 0x72, 0x79, 0x00
};
DatagramSocket socket = new DatagramSocket();
DatagramPacket pingRequest = new DatagramPacket(pingPayload, 0, pingPayload.length);
pingRequest.setAddress(InetAddress.getByName("93.190.140.60"));
pingRequest.setPort(28086);
socket.send(pingRequest);
byte[] rawBuffer = new byte[1024];
DatagramPacket pingResponse = new DatagramPacket(rawBuffer, 0, rawBuffer.length);
socket.receive(pingResponse);
ByteBuffer buffer = ByteBuffer.wrap(rawBuffer).order(ByteOrder.LITTLE_ENDIAN);
if (buffer.getInt() != 0xffffffff) throw new Exception("Invalid header");
if ((buffer.get() & 0xff) != 0x49) throw new Exception("Invalid packet type");
ServerData data = new ServerData();
data.protocol = buffer.get() & 0xff;
data.name = readString(buffer);
data.map = readString(buffer);
data.folder = readString(buffer);
data.game = readString(buffer);
data.id = buffer.getShort() & 0xffff;
data.players = buffer.get() & 0xff;
data.maxPlayers = buffer.get() & 0xff;
data.bots = buffer.get() & 0xff;
data.type = (char) (buffer.get() & 0xff);
data.environment = (char) (buffer.get() & 0xff);
data.passworded = buffer.get() == 1;
data.vac = buffer.get() == 1;
data.version = readString(buffer);
int edf = buffer.get() & 0xff;
if((edf & 0x80) != 0) data.gamePort = buffer.getShort() & 0xffff;
if((edf & 0x10) != 0) data.steamId = buffer.getLong();
if((edf & 0x20) != 0) data.keywords = readString(buffer);
if((edf & 0x01) != 0) {
data.gameId = buffer.getLong();
data.appId = buffer.getLong();
}
System.out.println(data);
}
private static String readString(ByteBuffer buffer) {
StringBuilder sb = new StringBuilder();
int c;
while ((c = buffer.get() & 0xff) != 0) sb.append((char) c);
return sb.toString();
}
}
@Xuline
Copy link

Xuline commented Apr 3, 2019

Hi dude,
it's possible to get world seed and world size with buffer ?

Very good job !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment