IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web & réseau Delphi Discussion :

Comment interroger un serveur de jeu ?


Sujet :

Web & réseau Delphi

  1. #1
    Membre averti
    Inscrit en
    Juin 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 18
    Par défaut Comment interroger un serveur de jeu ?
    Salut à tous,

    Tout d'abord merci pour vos réponses a mes précédents posts.

    Voila je cherche a transcrire en DELPHI un code php qui interroge le serveur du jeu call of duty pour récupérer des infos sur la partie en cours.

    Comme je sais pas trop dans quel direction partir je vais copier coller le petit script php qui permet de faire ca.

    Le voili :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    function retrieveCODData($ip, $port) {
    	global $r, $x, $p_flags, $g_flags, $playerdat, $teamcnt, $teamscor;
    	$fp = fsockopen("udp://$ip", $port, $errno, $errstr, 1);
    	if (!$fp) {
    		return "-FAILED";
    	} else {
    		fwrite($fp, "\xFF\xFF\xFF\xFFgetstatus\n");
    		socket_set_timeout($fp, 2);
    		do {
    			$chr .= fgetc($fp);
    			$status = socket_get_status($fp);
    		} while ($status["unread_bytes"]);
    		$r = explode("\\", $chr);
    		//echo $chr;
    		$teamscor=0;
     
    		for ($i=0;$i<30;$i++) if ($r[$i]=="Call of Duty") $teamscor=1;
     
    		if ($teamscor==1) {
    			$game = "COD";
    			$x = array();
    			for ($i=0;$i<count($r);$i++) {
    				$z = $i+1;
    				$r[$i]=strtolower($r[$i]);
    				$x["$r[$i]"] = $r[$z];
    			}
    			$x["mod"]=substr($x["mod"],0,1);
    			$playerlist = substr($chr,strpos($chr,"\\mod\\")+6);
    			$i=0;
    			$teamcnt->blue = 0;
    			$teamcnt->red = 0;
    			$teamcnt->spec = 0;
    			if (strlen($playerlist)<2) $playerlist="";
    			while($playerlist <> "") {
    				$player1 = substr($playerlist,0,strpos($playerlist,"\"\n"));
    				$playerlist = substr($playerlist,strlen($player1)+2);
    				$playerdat[$i]->score = substr($player1,0,strpos($player1," "));
    				$player1=substr($player1,strlen($playerdat[$i]->score)+1);
    				$playerdat[$i]->ping=substr($player1,0,strpos($player1," "));
    				$player1=substr($player1,strlen($playerdat[$i]->ping)+2);
    				$playerdat[$i]->name = $player1;
    				$i++;
    			}
    			$x["numplayers"] = $i;
    			return "+OK";
    		}
    	}
    }
    Donc a premier vue je crois comprendre qu'il sagit du protocole UDP. Il faut aussi l'adresse IP du serveur (j'ai) ainsi que le port (j'ai aussi).

    Mais comment interpréter $fp = fsockopen("udp://$ip", $port, $errno, $errstr, 1); en delphi?

    j'ai essayer avec les compo ICS, mais ca marche pas en fait c la ligne

    $fp = fsockopen("udp://$ip", $port, $errno, $errstr, 1);
    fwrite($fp, "\xFF\xFF\xFF\xFFgetstatus\n");
    socket_set_timeout($fp, 2); que je ne sais pas transcrire. A première vu on ouvre un socket puis on envoi le message '\xFF\xFF\xFF\xFFgetstatus\n' au serveur. Mais la signification de ce message m'est plutot obscur.

    Vous avez une idée un conseil, une piste. Merci
    _______________________________________
    [Balises code rajoutée par Lil_jam63]

  2. #2
    Membre chevronné
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Par défaut
    Avant de commencer à programmer ta fonction, je vois que ta variable $teamcnt est une instance de classe, est ce que tu disposes de cette classe portée sous delphi également?
    Si ce n'est pas le cas, commence d'abord à t'interesser à cette partie car dans ta fonction certaines méthodes de cette classe sont utilisées
    Pour ton problème de socket, je n'utilise pas les composant ICS mais c'est à peu près la même chose partout, voilà la signification des lignes citée ci-dessus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $fp = fsockopen("udp://$ip", $port, $errno, $errstr, 1);
    Tu ouvres une socket en UDP sur l'adresse IP spécifiée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite($fp, "\xFF\xFF\xFF\xFFgetstatus\n");
    Tu envoie la chaine "\xFF\xFF\xFF\xFFgetstatus\n" , le \n de la fin est un retour à la ligne qu'il te faut remplacer sous delphi par chr(13)+chr(10) ou alors #13+#10
    Citation Envoyé par Exemple
    .write('\xFF\xFF\xFF\xFFgetstatus'+#13+#10);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    socket_set_timeout($fp, 2);
    Tu définie un timeOut de 2 secondes.
    Avec ces explications et l'aide des composant ICS, tu devrais t'en sortir mais je te rappel que la difficulté de la chose est ailleurs, notamment la classe utilisée

  3. #3
    Membre averti
    Inscrit en
    Juin 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 18
    Par défaut
    merci beaucoup de ton aide je vois ca de suite et je te tien au courant

    pour $teamcnt c juste une structure dans laquelle est placé la score d'une équipe. La chaine de caractère retourné par le serveur contient le score suivant la couleur de l'équipe.

  4. #4
    Membre averti
    Inscrit en
    Juin 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 18
    Par défaut
    ayééééééééééééééééééééééé j'ai trouvé

    Pour info
    En fait pour avoir la bonne réponse du serveur
    la requête php "\xFF\xFF\xFF\xFFgetstatus\n"

    doit etre transcrite en

    chr(255)+ char(255) + chr(255)+ char(255) + 'getstatus'+ chr(13)+ char(10)

    Quand je t vu traduite \n par chr(13)+ char(10) ça a fait tilt

    car \xFF\xFF\xFF\xFF sont aussi des caractères échapés en php et ces caratères sont #255

    donc ca me donne avec le compo wsocket d'ICS :
    ws > c mon compo ICS

    ws.addr:=IP; // IP c l'adresse du serveur
    ws.Port:=28960; //c le port du jeu
    ws.Porto:='udp';
    ws.SendStr(chr(255)+ char(255) + chr(255)+ char(255) + 'getstatus'+ chr(13)+ char(10));
    ws.ReadLine(2,line);
    memo1.Lines.Add(line);

    Et ça me renvoi :
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ÿÿÿÿstatusResponse
    \.Admin\^1Morgane\.Blood_FX_3\On\.Email\^1morgane.^3server@^2free.fr\.Location\^4FR^7AN^1CE\.PRM_4\On\.Website\http://morgane.server.free.fr\fs_game\MorganeMOD_v2\g_gametype\dm\g_timeoutsallowed\0\gamename\Call of Duty\mapname\mp_carentan\protocol\6\scr_friendlyfire\2\scr_killcam\0\shortversion\1.5\sv_allowAnonymous\0\sv_floodProtect\1\sv_hostname\^1Morgane ^3Realistic ^2War\sv_maxclients\16\sv_maxPing\300\sv_maxRate\25000\sv_minPing\0\sv_privateClients\4\sv_punkbuster\0\sv_pure\1\con_disabled\1\pswrd\0\mod\1
    Bref tout ce dont j'ai besoin me reste plus qu'a découpé lette ligne pour exploité la réponse

    Pour info aussi beaucoup de serveur de jeu utilise cette requête pour renvoyer les parametres de la partie en cours

    Merci pour ton aide

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 298
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chr(255)+ char(255) + chr(255)+ char(255) + 'getstatus'+ chr(13)+ char(10)
    peut être remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #255+ #255 + #255+ #255 + 'getstatus'+ #13+ #10

  6. #6
    Membre chevronné
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Par défaut
    Exact, j'avais pas fait attention aux autres caractères échappés, bien joué

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/03/2010, 20h39
  2. Comment interroger un serveur DHCP en vb.net?
    Par GhostDady dans le forum ASP.NET
    Réponses: 2
    Dernier message: 03/12/2008, 14h48
  3. Comment gérer un serveur de jeu en ligne ?
    Par Markand dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 21/10/2008, 18h17
  4. comment detecter un serveur interbase???
    Par delphien dans le forum Bases de données
    Réponses: 2
    Dernier message: 12/04/2004, 17h35
  5. [VB6] Comment lister les serveurs SQL d'un domaine ?
    Par WOLO Laurent dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 29/01/2004, 08h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo