Problème fread()
Bonjour,
J'ai un petit souci avec mon code :
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 :
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 ?
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
-
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)...-
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)
-
-
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). -
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 -
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 ! -
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 -
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"); -
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? -
j ai rien dit, tu me l a mis
-
juste, tu peux me donner les valeurs de retour possibles stp?
-
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 -
Ok, bon appétit :)
-
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) ! -
$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 ? -
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) -
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 unfread($fp,1);
Pourtant il devrait me lire un seul caractère et me le retourner...
Des idées pour mieux cibler le problème ? -
pas de problemes ! tiens moi au courant ;)
par contre mets le \n entre guilement, ceux la -> ' (sous le 4) -
Re,
Du coup un stream_get_line($fp,1024,\n) serait adapté je pense ...
Je vais essayé merci pour ton aide ! -
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
-
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" -
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
Suivant