Problème fread()
Odd
-
Utilisateur anonyme -
Utilisateur anonyme -
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 ?
21 réponses
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.
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 :
Donc la réponse se termine avec un retour à la ligne...
Pourrais tu m'indiquer que faire de cette information ?
Merci
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
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"
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Re,
Du coup un stream_get_line($fp,1024,\n) serait adapté je pense ...
Je vais essayé merci pour ton aide !
Du coup un stream_get_line($fp,1024,\n) serait adapté je pense ...
Je vais essayé merci pour ton aide !
pas de problemes ! tiens moi au courant ;)
par contre mets le \n entre guilement, ceux la -> ' (sous le 4)
par contre mets le \n entre guilement, ceux la -> ' (sous le 4)
Re
Rien de bien concluant avec le
Je comprend pas pourquoi il bloque même lorsque je fais un
Pourtant il devrait me lire un seul caractère et me le retourner...
Des idées pour mieux cibler le problème ?
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 ?
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)
et sinon je sais pas trop. si t essur que c est \n en fin de ligne (ca peu etre \0 aussi :D)
$reponse = stream_get_line($fp,1024,'\n');
Le script php met bien 2-3 minutes (si ce n'est plus) pour me retourner :
$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 :
Ce qui devrait être affiché même si $reponse est vide, non ?
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 ?
D'après manuelphp.com stream_get_line() devrait réagir ainsi :
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) !
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) !
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
sinon e effet ca devrait quand meme s arreter. je regarde et je te redis. test avec \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?
essaye
$reponse = stream_get_line($fp,8,'\n');
et peux tu me donner le prototype de stream_get_line() stp?
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");
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");
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
$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
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 !
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 !
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
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
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 :
^^ 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).
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).