Rechercher : dans
Par :

Problème fread()

Dernière réponse le 10 jui 2009 à 12:46:00 Odd, le 9 jui 2009 à 10:45:59 
 Signaler ce message aux modérateurs

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

1

nagashima, le 9 jui 2009 à 10:49:31

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.

Répondre à nagashima

2

Odd, le 9 jui 2009 à 11:12:53

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

Répondre à Odd

3

Odd, le 9 jui 2009 à 11:15:32

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"

Répondre à Odd

4

nagashima, le 9 jui 2009 à 11:38:15

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

Répondre à nagashima

5

Odd, le 9 jui 2009 à 12:27:10

Re,

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

Je vais essayé merci pour ton aide !

Répondre à Odd

6

nagashima, le 9 jui 2009 à 12:34:58

Pas de problemes ! tiens moi au courant ;)

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

Répondre à nagashima

7

Odd, le 9 jui 2009 à 12:36:19

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 ?

Répondre à Odd

8

nagashima, le 9 jui 2009 à 12:39:17

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)

Répondre à nagashima

9

Odd, le 9 jui 2009 à 12:48:27

$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 ?

Répondre à Odd

10

Odd, le 9 jui 2009 à 12:52:33

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) !

Répondre à Odd

11

nagashima, le 9 jui 2009 à 13:54:40

Donc y a une probleme, mais pas a ce niveau la je pense. je regarde aprés mangé :D

Répondre à nagashima

12

Odd, le 9 jui 2009 à 13:56:40

Ok, bon appétit :)

Répondre à Odd

13

nagashima, le 9 jui 2009 à 14:21:29

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

Répondre à nagashima

14

nagashima, le 9 jui 2009 à 14:29:26

Juste, tu peux me donner les valeurs de retour possibles stp?

Répondre à nagashima

15

nagashima, le 9 jui 2009 à 14:30:04

J ai rien dit, tu me l a mis

Répondre à nagashima

16

nagashima, le 9 jui 2009 à 14:33:25

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?

Répondre à nagashima

17

nagashima, le 9 jui 2009 à 14:36:11

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");

Répondre à nagashima

18

nagashima, le 9 jui 2009 à 14:40:10

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

Répondre à nagashima

19

Odd, le 9 jui 2009 à 15:18:21

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 !

Répondre à Odd

20

nagashima, le 9 jui 2009 à 15:30:50

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

Répondre à nagashima