Problème fread()

Odd -  
 Utilisateur anonyme -
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 ?

21 réponses

Utilisateur anonyme
 
si le retour est >4 caractère, ca peut attendre la suite, ce qui peu prendre du temps. regarde si t as pas moyen de connaitre la longueur exacte, si il y a pas un caractère de fin, etc.
0
Odd
 
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
0
Odd
 
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"
0
Utilisateur anonyme
 
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Odd
 
Re,

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

Je vais essayé merci pour ton aide !
0
Utilisateur anonyme
 
pas de problemes ! tiens moi au courant ;)

par contre mets le \n entre guilement, ceux la -> ' (sous le 4)
0
Odd
 
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 ?
0
Utilisateur anonyme
 
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)
0
Odd
 
$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 ?
0
Odd
 
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) !
0
Utilisateur anonyme
 
donc y a une probleme, mais pas a ce niveau la je pense. je regarde aprés mangé :D
0
Odd
 
Ok, bon appétit :)
0
Utilisateur anonyme
 
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
0
Utilisateur anonyme
 
juste, tu peux me donner les valeurs de retour possibles stp?
0
Utilisateur anonyme
 
j ai rien dit, tu me l a mis
0
Utilisateur anonyme
 
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?
0
Utilisateur anonyme
 
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");
0
Utilisateur anonyme
 
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
0
Odd
 
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 !
0
Utilisateur anonyme
 
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
0
Odd
 
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).
0
Utilisateur anonyme
 
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?
0