Created
December 29, 2013 16:03
-
-
Save Emiel45/8171871 to your computer and use it in GitHub Desktop.
Rust server ping
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hi dude,
it's possible to get world seed and world size with buffer ?
Very good job !