Problème fread()

Bonjour,

J'ai un petit souci avec mon code :
$server_name = "server1.freeserv.fr";
$server_port = "34000";

$fp = fsockopen("udp://".gethostbyname($server_name), $server_port, $errno, $errstr, 30);
if (!$fp) {
	echo "Echec de la connection<br />\n";
    echo "$errstr ($errno)<br />\n";
} else {
	echo "Connection réussie<br />\n";
	echo "....Envoi de la requête<br />\n";
	echo "...........Valeur retour du fputs : ".fputs($fp, "/xff/xff/xff/xffchallenge rcon\n", 19)."<br />\n";
	echo "....Lecture de la réponse<br />\n";
	$reponse = fread($fp,4);
	echo "...........Valeur retour du fread : ".$reponse."<br />\n";
    fclose($fp);
}


Je pense que certains auront compris que j'essaye de communiquer avec un serveur half-life (hl1).
Le script met longtemps à s'executer et voici l'affichage :

Connection réussie
....Envoi de la requête
...........Valeur retour du fputs : 19
....Lecture de la réponse


Lorsque j'enlève l'argument "4" (length) du fread, le script s'exécute très rapidement mais bien sur rien ne m'est retourné...

Quelqu'un aurait il une idée ?
Configuration: Windows XP
Firefox 3.0.11

21 réponses

  • Votes
  • Date
  • Date décroissante
  1. Re,

    c'est à dire "Si tout s'est bien passé" ?
    J'ai l'impression que la lecture de la trame (du flux) plante totalement, et fait planter par la même occasion le script php, car la suite du script ne s'exécute même pas (echo "...........Valeur retour du fread : ".$reponse."<br />\n";).

    Normalement, même si la fonction stream_get_line échouait, je devrai avoir l'affichage de ce qu'il y a à l'intérieur du echo suivant la commande...

    En fait le problème n'est pas vraiment que cela touche des serveurs cs, vu que cela ne reste que du php...
    Je n'ai pas d'outils de débugage...
    Ce qui serait intéressant ça serait de savoir dans quel type de situation une fonction php de lecture de flux plante, et surtout si il n'y a pas de fonction permettant de mettre une sorte de timeout (si la lecture ne retourne rien au bout de se temps, elle s'arrete)...
    1. quand tout s'est bien passé : si le serveur a bien pris en compte ta commande et qu'elle s'est effectuée normalement. Donc si il n'y a pas de retour dans ce cas et qu'il n y a pas eu de problème, c est normal que ca bloque vu que ca attends quelque chose et qu'il n'y aura rien.

      si j'ai raison, regarde si tu peux faire des thread en php et si oui, implémente en 1 qui regardera la réponse (5seconde de vie sera suffisant)
  2. Bonjour !

    Comme on dit pas de nouvelle, bonne nouvelle :

    Alors j'ai ajouter un "sleep(10);" avant la lecture du flux comme tu me l'as conseillé ...

    Donc le tout met 10 secondes de plus (enfin théoriquement ^^) mais l'affichage devient :

    Connection réussie
    ....Envoi de la requête
    ...........Valeur retour du fputs : 19
    ....Lecture de la réponse


    ^^ Je sais je suis méchant, mais moi ausi j'y ai cru pendant un moment !
    "Non, non, rien à changer" comme disaient les Poppys.

    Bon je désespère, j'aimerai bien arrivé à envoyer commande rcon via un ptit script php, ca me faciliterai la vie ... mais ca ne marche pas (tout comme la classe phpRcon d'ailleur).
    1. mince . il faudrai quelqu'un qui aurait deja fait des scripts pour serveur cs, car moi je n'en ais jamais fait.

      juste une question qui ne sert surement a rien mais bon :
      Si tout s'est bien passé, t'es sur qu'il y a une valeur de retour?
  3. ca va j ai mangé kfc avec les gas de la boite x)

    j'avouerai que c est bizard. aprés la comme ca je bloque un peu...

    je suppose que les messages précédents s'affichent bien et donc que le probleme ne puisse venir que de la. on va tenter un truc a la con, mais bon. essaye de faire une pause de 10 secondes avant de récupérer la trame, parfois ca fonctionne
    1. Re, bien mangé ? ^^

      J'ai testé avec le persitant (pfsockopen) ca ne change rien (et bien sur j'ai remis les doubles guillements, et j'ai testé \n et \r ainsi que \0)

      Comme à son habitude le script ne veut pas m'afficher la ligne de retour du stream_get_line...

      C'est marrant qu'il arrive à écrire et pas a lire ce script !
      1. pour ca :

        $fp = fsockopen("udp://".gethostbyname($server_name), $server_port, $errno, $errstr, 30);

        j ai trouvé ca sur le net :

        $fp = pfsockopen("udp://".gethostbyname($server_name), $server_port, $errno, $errstr, 30);

        essaye avec ca , au cas ou :D
        1. bon apparement je me suis trompé, c est avec " et non '
          deja ca ca sera plus un probleme x)

          donc essaye celle ci

          $reponse = stream_get_line($fp,1024,"\n");
          ou celle la
          $reponse = stream_get_line($fp,1024,"\r");
          1. alors le fait que la réponse mette du temps, c est que l'on attend forcément un caractère de fin.

            essaye

            $reponse = stream_get_line($fp,8,'\n');

            et peux tu me donner le prototype de stream_get_line() stp?
            1. juste, tu peux me donner les valeurs de retour possibles stp?
              1. alors tu as aussi \r comme caractere de fin de trame ;D

                sinon e effet ca devrait quand meme s arreter. je regarde et je te redis. test avec \r
                1. D'après manuelphp.com stream_get_line() devrait réagir ainsi :

                  La lecture se termine lorsque length  ont été lus, ou que la chaîne ending  est trouvée dans le flux (et qui n'est pas  inclue dans la valeur retournée), ou la fin du fichier (le premier des trois).


                  Donc même si il s'avère que le caractère de fin n'est ni \0 ni \n la lecture devrait bien s'arrêter de toute façon (le résultat ayant soit une fin soit étant plus long que 1ko) !
                  1. donc y a une probleme, mais pas a ce niveau la je pense. je regarde aprés mangé :D
                2. $reponse = stream_get_line($fp,1024,'\n');

                  Le script php met bien 2-3 minutes (si ce n'est plus) pour me retourner :
                          Connection réussie
                          ....Envoi de la requête
                          ...........Valeur retour du fputs : 19
                          ....Lecture de la réponse


                  $reponse = stream_get_line($fp,1024,'\0');

                  Même comportement !

                  Je pense que la fonction stream_get_line (ou mm fread) plante vu que à l'affichage je n'ai même pas :
                  ...........Valeur retour du fread : 

                  Ce qui devrait être affiché même si $reponse est vide, non ?
                  1. fait plutot avec ces guillemets '
                    et sinon je sais pas trop. si t essur que c est \n en fin de ligne (ca peu etre \0 aussi :D)
                    1. Re

                      Rien de bien concluant avec le
                      $reponse = stream_get_line($fp,1024,"\n");


                      Je comprend pas pourquoi il bloque même lorsque je fais un
                      fread($fp,1);

                      Pourtant il devrait me lire un seul caractère et me le retourner...
                      Des idées pour mieux cibler le problème ?
                      1. pas de problemes ! tiens moi au courant ;)

                        par contre mets le \n entre guilement, ceux la -> ' (sous le 4)
                        1. Re,

                          Du coup un stream_get_line($fp,1024,\n) serait adapté je pense ...

                          Je vais essayé merci pour ton aide !
                          1. okok, alors si il y a un caractère de fin de ligne, ne cherche pas la longueur mais le '\0' ou '\n' ou ... j ai un trou pour le troisième. mais regarde quel est le caractère de fin, et attends plutot celui ci plutot qu'une longueur de 4 :D
                            1. Voici un exemple de réponse :
                              
                                       retour hexa                              
                              
                              ff   ff  ff  ff   63 68 61 6c               
                              6c 65 6e 67 65 20 72 63                
                              6f 6e 20 32 30 37 36 37                  
                              37 34 32 31 0a 00
                              
                                      retour décimal    
                              
                              255 255 255 255 099 104 097 108                                        
                              108 101 110 103 101 032 114 099 
                              111 110 032 050 048 055 054 055
                              055 052 050 049 010 000 
                              
                                              retour string
                              
                              ....chal
                              lenge rc
                              on 20767
                              7421..  
                              
                              
                              Analyse :
                              
                                  * Une suite de quatre octets de valeur FF ou 255.
                                  * Une string contenant :
                                        o La chaîne challenge rcon .
                                        o Le challenge, ici 207677421.
                                        o Un caractère de nouvelle ligne.


                              désolé pour les petits problèmes de "formatage du premier post"
                              1. Salut ! Merci de m'accorder un peu de temps pour m'aider...

                                Voici les informations concernant le protocole rcon de steam (hl1) par rapport à la réponse qui devrait être retournée :

                                Voici un exemple de réponse :
                                
                                         retour hexa                            retour décimal                      retour string
                                
                                ff   ff  ff  ff   63 68 61 6c     255 255 255 255 099 104 097 108            ....chal
                                6c 65 6e 67 65 20 72 63     108 101 110 103 101 032 114 099            lenge rc
                                6f 6e 20 32 30 37 36 37     111 110 032 050 048 055 054 055             on 20767
                                37 34 32 31 0a 00              055 052 050 049 010 000                         7421..  
                                
                                Analyse :
                                
                                    * Une suite de quatre octets de valeur FF ou 255.
                                    * Une string contenant :
                                          o La chaîne challenge rcon .
                                          o Le challenge, ici 207677421.
                                          o Un caractère de nouvelle ligne.
                                


                                Donc la réponse se termine avec un retour à la ligne...
                                Pourrais tu m'indiquer que faire de cette information ?
                                Merci
                                • 1
                                • 2