Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
FORUM PHP FAQ PHP COURS PHP SOURCES PHP LIVRES PHP SCRIPTS PHP OUTILS PHP COMPARATIFS PHP TV Zend Framework

Dialoguer avec un serveur Counter-Strike : Source en PHP

Date de publication : 4/09/2007

Par Adrien Pellegrini (Page d'accueil)
 

Comment récupérer des informations à propos d'un serveur Counter Strike : Source ? Comment lancer des commandes RCON depuis un site Web ? Comment faire une demande au "master server" de Steam pour récupérer la liste des serveurs disponibles ? Tout ceci vous est expliqué dans cet article.

I. Introduction
I.1. À lire
II. Requête sur un serveur
II.1. Challenge number
II.1.1. Format de la requête
II.1.2. Format de la réponse
II.1.3. Script
II.2. Informations sur le serveur
II.2.1. Format de la requête
II.2.2. Format de la réponse
II.2.3. Script
II.3. Informations sur les règles du serveur
II.3.1. Format de la requête
II.3.2. Format de la réponse
II.3.3. Script
II.4. Informations sur les joueurs
II.4.1. Format de la requête
II.4.2. Format de la réponse
II.4.3. Script
III. Commande RCON
III.1. Format de la requête
III.2. Format de la réponse
III.3. Script
IV. Lister les serveurs
IV.1. Format de la requête
IV.2. Format de la réponse
IV.3. Script
V. Scripts divers
V.1. Voir l'état du serveur
V.2. Fonctions utilisées
V.3. Classe
VI. Liens & remerciements


I. Introduction

On peut facilement récupérer toutes sortes d'informations en envoyant des paquets TCP ou UDP prédéfinis à des servers. Ceux-ci nous renverront un ou plusieurs paquets, appelé réponse, qui contiendront l'information désirée.

Les paquets utilisés par Steam ont une taille de 1400 bytes plus les entêtes IP/UDP (ou de 4096 bytes pour les commandes RCON).

Les réponses obtenues par le serveur sont généralement peu lisibles. Pour les rendre plus lisible, j'ai écrit à la fin de cet article une série de fonctions qui permettent de convertir les réponses.


I.1. À lire

Chaque sous partie va être séparée comme suit :
- Format de la requête correspond à la commande qu'il faut envoyer au serveur pour récupérer la réponse appropriée.
- Format de la réponse explique les différentes parties qui composent la réponse.
- Script nous montre le code PHP utilisé.


II. Requête sur un serveur

Un serveur répond à quatre requêtes qui sont les suivantes :
  1. récupérer un numéro de défi (challenge number)
  2. récupérer des informations à propos du serveur
  3. récupérer des informations sur les joueurs présents sur le serveur
  4. récupérer des informations sur les règles du serveur
Les requêtes doivent se faire via le protocole UDP.


II.1. Challenge number

Le challenge number est requis pour les requêtes concernant la récupération des règles du serveur ainsi que des joueurs présents dessus.


II.1.1. Format de la requête


0020   ff ff ff ff 57                         ....W
  
Donnée Type
0xFFFFFF int
W ou 0x57 byte

II.1.2. Format de la réponse


0020   ff ff ff ff 41 fa 05 a4 00           ....A....                                            
Donnée Type Explication
0xFFFFFF int -
Challenge long Le "chanllenge number" à utiliser

II.1.3. Script


// Constant
define('PACKET_SIZE', '1400');
define('SERVERQUERY_GETCHALLENGE', "\xFF\xFF\xFF\xFF\x57");
define ('REPLY_GETCHALLENGE', "\x41");

// Ip address and port
$_ip = '82.149.249.243';
$_port = '27017';

// Open a connection with server
$socket = stream_socket_client('udp://'.$_ip.':'.$_port, $errno, $errstr, 30);

// Send command to server
$cmd = SERVERQUERY_GETCHALLENGE;
$length = strlen($cmd);
fwrite($socket, $cmd, $length);

// Get response from server
$response = fread($socket, PACKET_SIZE);

// Clean response
$pattern = "#\xFF\xFF\xFF\xFF".REPLY_GETCHALLENGE."#";
$response = preg_replace($pattern, '', $response);

II.2. Informations sur le serveur

Cette partie consiste à récupérer toutes les informations disponibles sur un serveur tel que son nom, nombre de joueurs maximum, nombre de joueurs présents, carte en cours ...


II.2.1. Format de la requête

Requête au format hexadécimal

0020   FF FF FF FF 54 53 6F 75 72 63 65 20 45 6E 67 69   ÿÿÿÿTSource Engi
0030   6E 65 20 51 75 65 72 79 00                        ne Query
Donnée Type
0xFFFFFF int
T byte
Source Engine Query string

II.2.2. Format de la réponse

Réponse au format hexadécimal


0020                                 ff ff ff ff 49 07            ....I.
0030   77 77 77 2e 63 6c 61 6e 6b 69 6c 6c 65 72 7a 2e  www.clankillerz.
0040   64 65 20 2e 2e 3a 3a 50 75 62 6c 69 63 20 6f 6e  de ..::Public on
0050   6c 79 20 48 69 67 68 73 6b 69 6c 6c 3a 3a 2e 2e  ly Highskill::..
0060   00 64 65 5f 64 75 73 74 32 00 63 73 74 72 69 6b  .de_dust2.cstrik
0070   65 00 43 6f 75 6e 74 65 72 2d 53 74 72 69 6b 65  e.Counter-Strike
0080   3a 20 53 6f 75 72 63 65 00 f0 00 00 0f 00 64 77  : Source......dw
0090   00 01 31 2e 30 2e 30 2e 33 34 00                 ..1.0.0.34.
Donnée Type Explication
0xFFFFFF int -
Type byte Type est toujours égal à 'I' (0x49)
Version byte Version du réseau Steam, actuellement 0x07
Nom du server string -
Carte string -
Répertoire du jeu string Le nom du répertoire qui contient les fichiers du jeu (ex: "cstrike")
Description du jeu string Le nom complet du jeu (ex: "Counter-Strike : Source")
AppID short Steam Application ID, pour CSS c'est 240
Nombre de joueurs byte -
Nombre maximum de joueur byte -
Nombre de bots byte -
Serveur dédié byte 'l' pour listen, 'd' pour dedicated et 'p' pour Source TV
OS byte Système d'exploitation; 'l' pour Linux et 'w' pour Windows
Mot de passe byte Indique si le serveur est verrouillé par mot de passe; si 0x01 il y a un mot de passe
Sécurisé byte Indique si VAC est activé; si 0x01 VAC est activé
Version du jeu string Version du jeu (ex: "1.0.0.34")

II.2.3. Script

Envoi de la requête et récupération de la réponse

// Constant
define('PACKET_SIZE', '1400');
define('SERVERQUERY_INFO', "\xFF\xFF\xFF\xFFTSource Engine Query"); 
define ('REPLY_INFO', "\x49");

// Ip address and port
$_ip = '82.149.249.243';
$_port = '27017';

// Open connection with server
$socket = stream_socket_client('udp://'.$_ip.':'.$_port, $errno, $errstr, 30);

// Send command to server
$cmd = SERVERQUERY_INFO;
$length = strlen($cmd);
fwrite($socket, $cmd, $length);

// Get response from server
$response = fread($socket, PACKET_SIZE);

// Clean response
$pattern = "#\xFF\xFF\xFF\xFF".REPLY_INFO."#";
$response = preg_replace($pattern, '', $response);
Réponse d'une requête pour récupérer les info du serveur
La réponse obtenue après la requête n'est pas très lisible.
Formatage de la réponse pour la rendre plus lisible

//Version - byte (Network version. 0x07 is the current Steam version.)
$server['version'] = getByte($response);

// Ip and port
$server['ip'] = $_ip;
$server['port'] = $_port;

//Server Name - string (The Source server's name, eg: "Recoil NZ CS Server #1")
$server['name'] = trim(getString($response));

//Map - string (The current map being played, eg: "de_dust")
$server['map'] = getString($response);

//Game Directory - string (The name of the folder containing the game files, eg: "cstrike")
$server['gamedir'] = getString($response);

//Game Description- string (A friendly string name for the game type, eg: "Counter-Strike: Source")
$server['gamedesc'] = getString($response);

//AppID - short (Steam Application ID)
$server['appid'] = getShortSigned($response);

//Number of players - byte (The number of players currently on the server)
$server['numplayers'] = getByte($response);

//Maximum players - byte (Maximum allowed players for the server)
$server['maxplayers'] = getByte($response);

//Number of bots - byte (Number of bot players currently on the server)
$server['bot'] = getByte($response);

//Dedicated - byte ('l' for listen, 'd' for dedicated, 'p' for SourceTV)
$data = chr(getByte($response));

$server['dedicated'] = 0;
$server['sourcetv'] = 0;
$server['listen'] = 0;

if ($data == 'd') $server['dedicated'] = 1;
if ($data == 'p') $server['sourcetv'] = 1;
if ($data == 'l') $server['listen'] = 1;

//OS - byte (Host operating system. 'l' for Linux, 'w' for Windows)
$data = chr(getByte($response));

$server['os'] = 'undefined';

if ($data == 'l')
{
	$server['os'] = 'linux';
}
elseif ($data == 'w')
{
	$server['os'] = 'windows';
}

//Password - byte (If set to 0x01, a password is required to join this server)
$data = getByte($response);

$server['password'] = 0;

if ($data == 1)
{
	$server['password'] = 1;
}

//Secure - byte (if set to 0x01, this server is VAC secured)
$data = getByte($response);

$server['secure'] = 1;

if ($data == 1)
{
	$server['secure'] = 1;
}

//Game Version - string (The version of the game, eg: "1.0.0.22")
$server['gameversion'] = getString($response);
L'affichage du tableau $server nous donne :

Array
(
    [version] => 7
    [ip] => 82.149.249.243
    [port] => 27017
    [name] => www.clankillerz.de ..::Public only Highskill::..
    [map] => de_dust2
    [gamedir] => cstrike
    [gamedesc] => Counter-Strike: Source
    [appid] => 240
    [numplayers] => 0
    [maxplayers] => 15
    [bot] => 0
    [dedicated] => 1
    [sourcetv] => 0
    [listen] => 0
    [os] => windows
    [password] => 0
    [secure] => 1
    [gameversion] => 1.0.0.34
)

II.3. Informations sur les règles du serveur

Cette partie consiste à récupérer toutes les règles sur un serveur tel que mp_timelimit, sv_alltalk, ...


II.3.1. Format de la requête


FF FF FF FF 56 <4 byte challenge number>    ....V
Donnée Type
0xFFFFFF int
V (ou 0x56) byte
Challenge Number long

II.3.2. Format de la réponse

Réponse au format hexadécimal

0020                                 ff ff ff ff 45 41            ....EA
0030   00 6d 61 74 74 69 65 5f 6d 75 67 6d 6f 64 00 31  .mattie_mugmod.1
0040   00 6d 61 74 74 69 65 5f 65 76 65 6e 74 73 63 72  .mattie_eventscr
0050   69 70 74 73 00 31 00 65 76 65 6e 74 73 63 72 69  ipts.1.eventscri
0060   70 74 73 5f 76 65 72 00 31 2e 33 2e 30 2e 30 30  pts_ver.1.3.0.00
0070   36 00 6d 61 6e 69 5f 72 65 73 65 72 76 65 5f 73  6.mani_reserve_s
0080   6c 6f 74 73 00 30 00 6d 61 6e 69 5f 61 64 6d 69  lots.0.mani_admi
0090   6e 5f 70 6c 75 67 69 6e 5f 76 65 72 73 69 6f 6e  n_plugin_version
00a0   00 31 2e 32 42 65 74 61 52 20 56 53 50 00 6d 61  .1.2BetaR VSP.ma
00b0   6e 69 5f 74 69 63 6b 72 61 74 65 00 31 30 30 00  ni_tickrate.100.
00c0   6d 61 6e 69 5f 6e 65 78 74 6d 61 70 00 63 73 5f  mani_nextmap.cs_
00d0   6f 66 66 69 63 65 00 65 73 74 5f 76 65 72 73 69  office.est_versi
00e0   6f 6e 00 30 2e 34 31 37 61 00 6d 70 5f 74 65 61  on.0.417a.mp_tea
00f0   6d 70 6c 61 79 00 30 00 6d 70 5f 66 72 61 67 6c  mplay.0.mp_fragl
0100   69 6d 69 74 00 30 00 6d 70 5f 66 61 6c 6c 64 61  imit.0.mp_fallda
0110   6d 61 67 65 00 31 00 6d 70 5f 77 65 61 70 6f 6e  mage.1.mp_weapon
0120   73 74 61 79 00 30 00 6d 70 5f 66 6f 72 63 65 72  stay.0.mp_forcer
0130   65 73 70 61 77 6e 00 31 00 6d 70 5f 66 6f 6f 74  espawn.1.mp_foot
0140   73 74 65 70 73 00 31 00 6d 70 5f 66 6c 61 73 68  steps.1.mp_flash
0150   6c 69 67 68 74 00 31 00 6d 70 5f 61 75 74 6f 63  light.1.mp_autoc
0160   72 6f 73 73 68 61 69 72 00 31 00 64 65 63 61 6c  rosshair.1.decal
0170   66 72 65 71 75 65 6e 63 79 00 34 35 00 6d 70 5f  frequency.45.mp_
0180   74 65 61 6d 6c 69 73 74 00 68 67 72 75 6e 74 3b  teamlist.hgrunt;
0190   73 63 69 65 6e 74 69 73 74 00 6d 70 5f 61 6c 6c  scientist.mp_all
01a0   6f 77 4e 50 43 73 00 31 00 6d 70 5f 66 72 69 65  owNPCs.1.mp_frie
01b0   6e 64 6c 79 66 69 72 65 00 31 00 73 76 5f 67 72  ndlyfire.1.sv_gr
01c0   61 76 69 74 79 00 38 30 30 00 73 76 5f 73 74 6f  avity.800.sv_sto
01d0   70 73 70 65 65 64 00 37 35 00 73 76 5f 6e 6f 63  pspeed.75.sv_noc
01e0   6c 69 70 61 63 63 65 6c 65 72 61 74 65 00 35 00  lipaccelerate.5.
01f0   73 76 5f 6e 6f 63 6c 69 70 73 70 65 65 64 00 35  sv_noclipspeed.5
0200   00 73 76 5f 73 70 65 63 61 63 63 65 6c 65 72 61  .sv_specaccelera
0210   74 65 00 35 00 73 76 5f 73 70 65 63 73 70 65 65  te.5.sv_specspee
0220   64 00 31 00 73 76 5f 73 70 65 63 6e 6f 63 6c 69  d.1.sv_specnocli
0230   70 00 30 00 73 76 5f 6d 61 78 73 70 65 65 64 00  p.0.sv_maxspeed.
0240   33 32 30 00 73 76 5f 61 63 63 65 6c 65 72 61 74  320.sv_accelerat
0250   65 00 35 00 73 76 5f 61 69 72 61 63 63 65 6c 65  e.5.sv_airaccele
0260   72 61 74 65 00 31 30 00 73 76 5f 77 61 74 65 72  rate.10.sv_water
0270   61 63 63 65 6c 65 72 61 74 65 00 31 30 00 73 76  accelerate.10.sv
0280   5f 77 61 74 65 72 66 72 69 63 74 69 6f 6e 00 31  _waterfriction.1
0290   00 73 76 5f 66 6f 6f 74 73 74 65 70 73 00 31 00  .sv_footsteps.1.
02a0   73 76 5f 72 6f 6c 6c 73 70 65 65 64 00 32 30 30  sv_rollspeed.200
02b0   00 73 76 5f 72 6f 6c 6c 61 6e 67 6c 65 00 30 00  .sv_rollangle.0.
02c0   73 76 5f 66 72 69 63 74 69 6f 6e 00 34 00 73 76  sv_friction.4.sv
02d0   5f 62 6f 75 6e 63 65 00 30 00 73 76 5f 73 74 65  _bounce.0.sv_ste
02e0   70 73 69 7a 65 00 31 38 00 72 5f 56 65 68 69 63  psize.18.r_Vehic
02f0   6c 65 56 69 65 77 44 61 6d 70 65 6e 00 31 00 72  leViewDampen.1.r
0300   5f 4a 65 65 70 56 69 65 77 44 61 6d 70 65 6e 46  _JeepViewDampenF
0310   72 65 71 00 37 2e 30 00 72 5f 4a 65 65 70 56 69  req.7.0.r_JeepVi
0320   65 77 44 61 6d 70 65 6e 44 61 6d 70 00 31 2e 30  ewDampenDamp.1.0
0330   00 72 5f 4a 65 65 70 56 69 65 77 5a 48 65 69 67  .r_JeepViewZHeig
0340   68 74 00 31 30 2e 30 00 72 5f 41 69 72 62 6f 61  ht.10.0.r_Airboa
0350   74 56 69 65 77 44 61 6d 70 65 6e 46 72 65 71 00  tViewDampenFreq.
0360   37 2e 30 00 72 5f 41 69 72 62 6f 61 74 56 69 65  7.0.r_AirboatVie
0370   77 44 61 6d 70 65 6e 44 61 6d 70 00 31 2e 30 00  wDampenDamp.1.0.
0380   72 5f 41 69 72 62 6f 61 74 56 69 65 77 5a 48 65  r_AirboatViewZHe
0390   69 67 68 74 00 30 2e 30 00 6d 70 5f 74 69 6d 65  ight.0.0.mp_time
03a0   6c 69 6d 69 74 00 35 30 30 00 73 76 5f 61 6c 6c  limit.500.sv_all
03b0   74 61 6c 6b 00 30 00 6d 70 5f 64 79 6e 61 6d 69  talk.0.mp_dynami
03c0   63 70 72 69 63 69 6e 67 00 30 00 6e 65 78 74 6c  cpricing.0.nextl
03d0   65 76 65 6c 00 00 6d 70 5f 61 75 74 6f 74 65 61  evel..mp_autotea
03e0   6d 62 61 6c 61 6e 63 65 00 31 00 6d 70 5f 6d 61  mbalance.1.mp_ma
03f0   78 72 6f 75 6e 64 73 00 30 00 6d 70 5f 72 6f 75  xrounds.0.mp_rou
0400   6e 64 74 69 6d 65 00 34 00 6d 70 5f 66 72 65 65  ndtime.4.mp_free
0410   7a 65 74 69 6d 65 00 35 00 6d 70 5f 63 34 74 69  zetime.5.mp_c4ti
0420   6d 65 72 00 33 35 00 6d 70 5f 6c 69 6d 69 74 74  mer.35.mp_limitt
0430   65 61 6d 73 00 30 00 6d 70 5f 68 6f 73 74 61 67  eams.0.mp_hostag
0440   65 70 65 6e 61 6c 74 79 00 33 00 73 76 5f 76 6f  epenalty.3.sv_vo
0450   69 63 65 65 6e 61 62 6c 65 00 31 00 73 76 5f 63  iceenable.1.sv_c
0460   6f 6e 74 61 63 74 00 77 77 77 2e 63 6c 61 6e 6b  ontact.www.clank
0470   69 6c 6c 65 72 7a 2e 64 65 00 73 76 5f 70 61 75  illerz.de.sv_pau
0480   73 61 62 6c 65 00 30 00 73 76 5f 63 68 65 61 74  sable.0.sv_cheat
0490   73 00 30 00 63 6f 6f 70 00 30 00 64 65 61 74 68  s.0.coop.0.death
04a0   6d 61 74 63 68 00 31 00 74 76 5f 70 61 73 73 77  match.1.tv_passw
04b0   6f 72 64 00 30 00 74 76 5f 72 65 6c 61 79 70 61  ord.0.tv_relaypa
04c0   73 73 77 6f 72 64 00 30 00 73 76 5f 70 61 73 73  ssword.0.sv_pass
04d0   77 6f 72 64 00 30 00                             word.0.
Donnée Type Explication
0xFFFFFF int -
Type byte Type est toujours égal à 'E' (0x45)
Nombre de règle short -
Nom de la règle string -
Valeur de la règle string -

II.3.3. Script

Envoi de la requête et récupération de la réponse

// Constant
define('PACKET_SIZE', '1400');
define('SERVERQUERY_GETCHALLENGE', "\xFF\xFF\xFF\xFF\x57");
define('SERVERQUERY_RULES', "\xFF\xFF\xFF\xFF\x56");
define('REPLY_GETCHALLENGE', "\x41");
define('REPLY_RULES', "\x45");

// Ip address and port
$_ip = '82.149.249.243';
$_port = '27017';

// Open connection with server
$socket = stream_socket_client('udp://'.$_ip.':'.$_port, $errno, $errstr, 30);

// Get the challenge number
// Send command to server
$cmd = SERVERQUERY_GETCHALLENGE;
$length = strlen($cmd);
fwrite($socket, $cmd, $length);

// Get response from server
$response = fread($socket, PACKET_SIZE);

// Filter the response
$pattern = "´\xFF\xFF\xFF\xFF".REPLY_GETCHALLENGE."´";
$challengeNumber = preg_replace($pattern, '', $response);

// Get the server rules info
// Send command to server
$cmd = SERVERQUERY_RULES.$challengeNumber;
$length = strlen($cmd);
fwrite($socket, $cmd, $length);

// Get response from server
$response = fread($socket, PACKET_SIZE);

// Clean response
$pattern = "#\xFF\xFF\xFF\xFF".REPLY_RULES."#";
$response = preg_replace($pattern, '', $response);
Formatage de la réponse pour la rendre plus lisible

// Number of rules
$ruleNumber = getShortSigned($response);

while ($response !== false)
{
	//Rule Name - string (The name of the rule)
	$name = getString($response);
	
	//Rule Value - string (The rule's value)
	$rules[$name] = getString($response);
}
L'affichage du tableau $rules nous donne :

Array
(
    [mattie_mugmod] => 1
    [mattie_eventscripts] => 1
    [eventscripts_ver] => 1.3.0.006
    [mani_reserve_slots] => 0
    [mani_admin_plugin_version] => 1.2BetaR VSP
    [mani_tickrate] => 100
    [mani_nextmap] => cs_office
    [est_version] => 0.417a
    [mp_teamplay] => 0
    [mp_fraglimit] => 0
    [mp_falldamage] => 1
    [mp_weaponstay] => 0
    [mp_forcerespawn] => 1
    [mp_footsteps] => 1
    [mp_flashlight] => 1
    [mp_autocrosshair] => 1
    [decalfrequency] => 45
    [mp_teamlist] => hgrunt;scientist
    [mp_allowNPCs] => 1
    [mp_friendlyfire] => 1
    [sv_gravity] => 800
    [sv_stopspeed] => 75
    [sv_noclipaccelerate] => 5
    [sv_noclipspeed] => 5
    [sv_specaccelerate] => 5
    [sv_specspeed] => 1
    [sv_specnoclip] => 0
    [sv_maxspeed] => 320
    [sv_accelerate] => 5
    [sv_airaccelerate] => 10
    [sv_wateraccelerate] => 10
    [sv_waterfriction] => 1
    [sv_footsteps] => 1
    [sv_rollspeed] => 200
    [sv_rollangle] => 0
    [sv_friction] => 4
    [sv_bounce] => 0
    [sv_stepsize] => 18
    [r_VehicleViewDampen] => 1
    [r_JeepViewDampenFreq] => 7.0
    [r_JeepViewDampenDamp] => 1.0
    [r_JeepViewZHeight] => 10.0
    [r_AirboatViewDampenFreq] => 7.0
    [r_AirboatViewDampenDamp] => 1.0
    [r_AirboatViewZHeight] => 0.0
    [mp_timelimit] => 500
    [sv_alltalk] => 0
    [mp_dynamicpricing] => 0
    [nextlevel] => 
    [mp_autoteambalance] => 1
    [mp_maxrounds] => 0
    [mp_roundtime] => 4
    [mp_freezetime] => 5
    [mp_c4timer] => 35
    [mp_limitteams] => 0
    [mp_hostagepenalty] => 3
    [sv_voiceenable] => 1
    [sv_contact] => www.clankillerz.de
    [sv_pausable] => 0
    [sv_cheats] => 0
    [coop] => 0
    [deathmatch] => 1
    [tv_password] => 0
    [tv_relaypassword] => 0
    [sv_password] => 0
)

II.4. Informations sur les joueurs

Cette partie consiste à récupérer quelques informations à propos des joueurs présents sur le serveur tel que leur pseudo, nombre de skills et temps présents sur le serveur.


II.4.1. Format de la requête


0020   FF FF FF FF 55 <4 byte challenge number>    ....U
Donnée Type
0xFFFFFF int
U (ou 0x55) byte
Challenge Number long

II.4.2. Format de la réponse


0020                                 ff ff ff ff 44 08            ....D.
0030   00 c2 bb 7d c3 87 4b c5 bd 7b c2 ab 30 30 37 7c  ...}..K..{..007|
0040   6c 6f 57 62 49 72 64 00 33 00 00 00 39 97 6d 45  loWbIrd.3...9.mE
0050   01 42 69 6c 6c 79 74 68 65 4b 69 64 00 05 00 00  .BillytheKid....
0060   00 83 01 82 44 02 c5 a0 c4 ac c5 98 c5 8e e2 84  ....D...........
0070   a2 c2 aa c2 b9 7c 20 4c 75 6b 40 73 31 39 38 39  .....| Luk@s1989
0080   28 63 68 29 00 01 00 00 00 3d 5a 49 43 03 44 72  (ch).....=ZIC.Dr
0090   2e 45 76 69 6c 20 5b 47 45 52 5d 00 01 00 00 00  .Evil [GER].....
00a0   cf 29 a3 42 04 46 61 74 74 69 58 78 5e 00 0e 00  .).B.FattiXx^...
00b0   00 00 dc 5f 4d 44 05 5e 53 6f 4f 6e 59 20 3a 3e  ..._MD.^SoOnY :>
00c0   20 3a 3e 20 3a 3e 00 01 00 00 00 2b 23 8e 42 07   :> :>.....+#.B.
00d0   49 73 4e 23 50 77 4e 62 00 01 00 00 00 b4 bd 21  IsN#PwNb.......!
00e0   43 0d 21 62 45 6a 6b 32 31 4f 2a 00 1e 00 00 00  C.!bEjk21O*.....
00f0   66 a9 0b 45                                      f..E
Donnée Type Explication
0xFFFFFF int -
Type byte Type est toujours égal à 'D' (0x44)
Nombre de joueurs byte -
Index byte Index compris entre 0 et le nombre de joueurs
Nom du joueur string -
Kills long -
Temps connecté float Temps en seconde

II.4.3. Script

Envoi de la requête et récupération de la réponse

//