Fr/Server queries: Difference between revisions
m (→A2S_PLAYER) |
|||
Line 313: | Line 313: | ||
== A2S_PLAYER == | == A2S_PLAYER == | ||
Cette requête permet d'obtenir des informations sur les joueurs actuellement présents sur le serveur. | |||
{{note | Cette requête nécessite un challenge.}} | |||
=== Format de la requête === | |||
{| | |||
! Donnée !! Type !! Valeur | |||
|- | |||
| En-tête || [[byte]] || 'U' (85) | |||
|- | |||
| Challenge || [[long]] || ''variable'' | |||
|} | |||
{| style="background:transparent;" | |||
| | |||
FF FF FF FF 55 ED 9A E1 0C ÿÿÿÿUíšá. | |||
|} | |||
=== Format de la réponse === | |||
{| style="background:transparent;" | |||
| | |||
FF FF FF FF 44 02 01 5B 44 5D 2D 2D 2D 2D 3E 54 ÿÿÿÿD..[D]---->T | |||
2E 4E 2E 57 3C 2D 2D 2D 2D 00 0E 00 00 00 B4 97 .N.W<----.....´— | |||
00 44 02 4B 69 6C 6C 65 72 20 21 21 21 00 05 00 .D.Killer !!!... | |||
00 00 69 24 D9 43 ..i$ÙC | |||
|} | |||
{| | |||
! Donnée !! Type !! Commentaire !! Valeur de l'exemple | |||
|- | |||
| En-tête || [[byte]] || Toujours égal à 'D' (68). || 68 | |||
|- | |||
| Joueurs || [[byte]] || Nombre de joueurs dont les informations sont fournies. || 2 | |||
|- | |||
| colspan="3" | Pour chaque joueur présent dans la réponse on trouve les données suivantes : | |||
{| style="margin:10px" | |||
! Donnée !! Type !! Commentaire | |||
|- | |||
| Index || [[byte]] || Numéro du joueur dans cette réponse. | |||
|- | |||
| Nom || [[string]] || Nom du joueur. | |||
|- | |||
| Score || [[long]] || Score du joueur (généralement le nombre de frags). | |||
|- | |||
| Durée || [[float]] || Durée (en seconde) depuis laquelle le joueur est connecté sur le serveur. | |||
|} | |||
| | |||
{| style="margin:10px" | |||
| 1 || [D]---->T.N.W<---- || 14 || 514.37036 | |||
|- | |||
| 2 || Killer !!! || 5 || 434.28445 | |||
|} | |||
|} | |||
{{note | Lorsqu'un joueur est en train de se connecter au serveur il est comptabilisé dans le nombre de joueurs de la réponse, mais ces données ne sont pas contenues dans cette dernière.}} | |||
== A2S_RULES == | == A2S_RULES == | ||
= Voir aussi = | = Voir aussi = |
Revision as of 20:45, 20 January 2008
Il est possible d'interroger un serveur de jeu basé sur le moteur Goldsource (Half-Life et ses Mods) ou Source (Half-Life 2 et ses Mods) en utilisant des paquets UDP/IP. Cet article décrit le format des différents paquets pouvant être envoyés ou reçus ainsi que le protocole utilisé pour les acheminer.
Types de données
Chaque requête ou réponse utilise cinq types de base, assemblés pour former un flux de données. Tous ces types sont little-endian, il n'y a donc aucune conversion à effectuer sur un processeur x86.
Type | Description |
---|---|
byte | Caractère non signé (8 bits). |
short | Entier court signé (16 bits). |
long | Entier long signé (32 bits). |
float | Nombre à virgule flottante (32 bits). |
string | Suite d'octets de longueur variable terminée par le caractère NUL. |
Protocole
La taille des paquets utilisés par le protocole d'interrogation est de 1400 octets (sans compter l'en-tête UDP/IP). Chaque réponse contient un en-tête propre au protocole, mais si une réponse nécessite plus d'un paquet elle sera alors découpée et chaque paquet comprendra un en-tête additionnel.
Réponse simple
Donnée | Type | Commentaire |
---|---|---|
En-tête | long | Toujours égal à -1 (0xFFFFFFFF). |
Données |
Réponse multi-paquets
Serveur Goldsource
Donnée | Type | Commentaire |
---|---|---|
En-tête | long | Toujours égal à -2 (0xFFFFFFFE). |
ID | long | Numéro unique attribué par le serveur à chaque paquet appartenant à la même réponse. |
Nombre et numéro de paquet | byte | Les 4 bits de poids fort représentent le numéro du paquet courant (en commençant à 0) et les 4 bits de poids faible représentent le nombre total de paquets (de 2 à 15). |
Données |
Serveur Source
Donnée | Type | Commentaire | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
En-tête | long | Toujours égal à -2 (0xFFFFFFFE). | |||||||||
ID | long | Même signification que pour un serveur Goldsource, cependant si le bit de poids fort est à 1 alors la réponse a été compressé avec l'algorithme Bzip2 avant d'être découpée. Après avoir récupéré et assemblé tous les paquets il faut décompresser la réponse (avec BZ2_bzBuffToBuffDecompress() en C ou bzdecompress() en PHP par exemple) avant de pouvoir la traiter. | |||||||||
Nombre de paquets | byte | Nombre total de paquets de la réponse. | |||||||||
Numéro de paquet | byte | La numérotation commence à 0. | |||||||||
Taille des paquets | short | Uniquement présent dans la nouvelle version du moteur Source, il s'agit de la taille maximale que peut prendre un paquet avant qu'un découpage ne se produise (auparavant il était impossible de changer cette taille). Cela concerne uniquement le protocole de jeu, dans celui d'interrogation des serveurs il n'est toujours pas possible de demander des paquets de plus petite taille que celle par défaut.
La valeur par défaut est de 1248 octets (0x04E0), mais l'administrateur du serveur peut la diminuer. | |||||||||
Uniquement présent dans le premier paquet (numéro 0) si la réponse a été compressé :
| |||||||||||
Données |
Comme les paquets UDP peuvent arriver dans le désordre et en différé, chaque paquet devrait être contrôlé avec son ID et son numéro pour s'assurer qu'il s'agit toujours de la même réponse et que tous les paquets sont arrivés.
Requêtes
Le format des requêtes est le même que celui des réponses (il est rare de devoir faire une requête multi-paquets toutefois). Les requêtes doivent être envoyées en UDP sur le port d'écoute du serveur (généralement 27015).
A2A_PING
Cette requête qui ne retourne aucune donnée exploitable ne sert qu'à vérifier que le serveur répond correctement. Elle peut être utilisée pour calculer le temps de latence du serveur.
Format de la requête
Donnée | Type | Valeur |
---|---|---|
En-tête | byte | 'i' (105) |
FF FF FF FF 69 ÿÿÿÿi |
Format de la réponse
Serveur Goldsource
FF FF FF FF 6A 00 ÿÿÿÿj. |
Donnée | Type | Commentaire | Valeur de l'exemple |
---|---|---|---|
En-tête | byte | Toujours égal à 'j' (106). | 106 |
Contenu | string | Toujours une chaîne vide. |
Serveur Source
FF FF FF FF 6A 30 30 30 30 30 30 30 30 30 30 30 ÿÿÿÿj00000000000 30 30 30 00 000. |
Donnée | Type | Commentaire | Valeur de l'exemple |
---|---|---|---|
En-tête | byte | Toujours égal à 'j' (106). | 106 |
Contenu | string | Toujours une chaîne composée de quatorze 0. | 00000000000000 |
A2S_INFO
Cette requête permet d'obtenir des informations sur le serveur comme son nom ou le jeu joué actuellement.
Format de la requête
Donnée | Type | Valeur |
---|---|---|
En-tête | byte | 'T' (84) |
Contenu | string | Source Engine Query |
FF FF FF FF 54 53 6F 75 72 63 65 20 45 6E 67 69 ÿÿÿÿTSource Engi 6E 65 20 51 75 65 72 79 00 ne Query. |
Format de la réponse
Serveur Goldsource
FF FF FF FF 6D 37 37 2E 31 31 31 2E 31 39 34 2E ÿÿÿÿm77.111.194. 31 31 30 3A 32 37 30 31 35 00 46 52 20 2D 20 56 110:27015.FR - V 65 72 79 47 61 6D 65 73 2E 6E 65 74 20 2D 20 44 eryGames.net - D 65 61 74 6D 61 74 63 68 20 2D 20 6F 6E 6C 79 20 eatmatch - only 73 75 72 66 5F 73 6B 69 20 2D 20 6E 67 52 00 73 surf_ski - ngR.s 75 72 66 5F 73 6B 69 00 63 73 74 72 69 6B 65 00 urf_ski.cstrike. 43 6F 75 6E 74 65 72 2D 53 74 72 69 6B 65 00 0C Counter-Strike.. 12 2F 64 6C 00 01 77 77 77 2E 63 6F 75 6E 74 65 ./dl..www.counte 72 2D 73 74 72 69 6B 65 2E 6E 65 74 00 00 00 01 r-strike.net.... 00 00 00 00 9E F7 0A 00 01 01 00 ....ž÷..... |
Donnée | Type | Commentaire | Valeur de l'exemple | ||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
En-tête | byte | Toujours égal à 'm' (109). | 109 | ||||||||||||||||||||||||||||||||
Adresse | string | Adresse IP et port du serveur. | 77.111.194.110:27015 | ||||||||||||||||||||||||||||||||
Nom | string | Nom du serveur. | FR - VeryGames.net - Deatmatch - only surf_ski - ngR | ||||||||||||||||||||||||||||||||
Carte | string | Nom de la carte jouée actuellement. | surf_ski | ||||||||||||||||||||||||||||||||
Dossier | string | Nom du dossier contenant les fichiers du jeu. | cstrike | ||||||||||||||||||||||||||||||||
Jeu | string | Nom complet du jeu. | Counter-Strike | ||||||||||||||||||||||||||||||||
Joueurs | byte | Nombre de joueurs actuellement en train de jouer | 12 | ||||||||||||||||||||||||||||||||
Places | byte | Nombre maximum de joueurs que le serveur peut accueillir. | 18 | ||||||||||||||||||||||||||||||||
Protocole | byte | Version du protocole utilisé par le serveur. | 47 | ||||||||||||||||||||||||||||||||
Serveur | byte | Indique le type du serveur :
|
'd' | ||||||||||||||||||||||||||||||||
Environnement | byte | Indique le système d'exploitation du serveur :
|
'l' | ||||||||||||||||||||||||||||||||
Visibilité | byte | Indique si le serveur requiert un mot de passe :
|
0 | ||||||||||||||||||||||||||||||||
Mod | byte | Indique si le jeu est un Mod :
|
1 | ||||||||||||||||||||||||||||||||
Uniquement présent si le jeu est un Mod :
| |||||||||||||||||||||||||||||||||||
VAC | byte | Indique si le serveur utilise le VAC :
|
1 | ||||||||||||||||||||||||||||||||
Bots | byte | Nombre de bots présents sur le serveur. | 0 |
Serveur Source
FF FF FF FF 49 07 50 75 62 6C 69 63 20 53 65 72 ÿÿÿÿI.Public Ser 76 65 72 20 54 69 63 6B 20 31 30 30 20 77 77 77 ver Tick 100 www 2E 6C 61 72 75 73 68 2E 64 65 00 64 6D 5F 6C 6F .larush.de.dm_lo 63 6B 64 6F 77 6E 00 68 6C 32 6D 70 00 54 65 61 ckdown.hl2mp.Tea 6D 20 44 65 61 74 68 6D 61 74 63 68 00 40 01 0F m Deathmatch.@.. 10 00 64 77 00 01 31 2E 30 2E 30 2E 31 32 00 ..dw..1.0.0.12. |
Donnée | Type | Commentaire | Valeur de l'exemple | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
En-tête | byte | Toujours égal à 'I' (73). | 73 | ||||||||||||||||
Protocole | byte | Version du protocole utilisé par le serveur. | 7 | ||||||||||||||||
Nom | string | Nom du serveur. | Public Server Tick 100 www.larush.de | ||||||||||||||||
Carte | string | Nom de la carte jouée actuellement. | dm_lockdown | ||||||||||||||||
Dossier | string | Nom du dossier contenant les fichiers du jeu. | hl2mp | ||||||||||||||||
Jeu | string | Nom complet du jeu. | Team Deathmatch | ||||||||||||||||
AppID | short | Steam Application ID du jeu. | 320 | ||||||||||||||||
Joueurs | byte | Nombre de joueurs actuellement en train de jouer | 15 | ||||||||||||||||
Places | byte | Nombre maximum de joueurs que le serveur peut accueillir. | 16 | ||||||||||||||||
Bots | byte | Nombre de bots présents sur le serveur. | 0 | ||||||||||||||||
Serveur | byte | Indique le type du serveur :
|
'd' | ||||||||||||||||
Environnement | byte | Indique le système d'exploitation du serveur :
|
'w' | ||||||||||||||||
Visibilité | byte | Indique si le serveur requiert un mot de passe :
|
0 | ||||||||||||||||
VAC | byte | Indique si le serveur utilise le VAC :
|
1 | ||||||||||||||||
Uniquement s'il s'agit d'un serveur The Ship :
| |||||||||||||||||||
Version | string | Version du jeu installée sur le serveur. | 1.0.0.12 |


A2S_SERVERQUERY_GETCHALLENGE
Les serveurs ne répondent à certaines requêtes que si un nombre particulier (appelé challenge) y est joint. La requête ci-dessous permet d'obtenir ce challenge.
Format de la requête
Donnée | Type | Valeur |
---|---|---|
En-tête | byte | 'W' (87) |
FF FF FF FF 57 ÿÿÿÿW |
Format de la réponse
FF FF FF FF 41 4B A1 D5 22 ÿÿÿÿAK¡Õ" |
Donnée | Type | Commentaire | Valeur de l'exemple |
---|---|---|---|
En-tête | byte | Toujours égal à 'A' (65). | 65 |
Challenge | long | Nombre à joindre aux requêtes le nécessitant. | 584425803 |
A2S_PLAYER
Cette requête permet d'obtenir des informations sur les joueurs actuellement présents sur le serveur.

Format de la requête
Donnée | Type | Valeur |
---|---|---|
En-tête | byte | 'U' (85) |
Challenge | long | variable |
FF FF FF FF 55 ED 9A E1 0C ÿÿÿÿUíšá. |
Format de la réponse
FF FF FF FF 44 02 01 5B 44 5D 2D 2D 2D 2D 3E 54 ÿÿÿÿD..[D]---->T 2E 4E 2E 57 3C 2D 2D 2D 2D 00 0E 00 00 00 B4 97 .N.W<----.....´— 00 44 02 4B 69 6C 6C 65 72 20 21 21 21 00 05 00 .D.Killer !!!... 00 00 69 24 D9 43 ..i$ÙC |
Donnée | Type | Commentaire | Valeur de l'exemple | |||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
En-tête | byte | Toujours égal à 'D' (68). | 68 | |||||||||||||||||||||||
Joueurs | byte | Nombre de joueurs dont les informations sont fournies. | 2 | |||||||||||||||||||||||
Pour chaque joueur présent dans la réponse on trouve les données suivantes :
|
|
