IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Sockets : Comment lire jusqu'à la fin ?


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Points : 65
    Points
    65
    Par défaut Sockets : Comment lire jusqu'à la fin ?
    Bonjour, je ne sais pas vraiment si ma question est claire, je vais tenter d'éclaircir ici l'idée.

    Je désire faire un client qui se connecte à un serveur de type SmartFox.

    En temps normal, le client est un flash, mais je voudrai m'y connecter en PHP. Donc via un sniffer de paquets, je regarde ce qu'il transite et voici les premiers lignes :

    <cross-domain-policy><allow-access-from domain='*' to-ports='9339' /></cross-domain-policy>
    <policy-file-request/>
    <cross-domain-policy><allow-access-from domain='*' to-ports='9339' /></cross-domain-policy>.
    <msg t='sys'><body action='verChk' r='0'><ver v='161' /></body></msg>.
    <msg t='sys'><body action='apiOK' r='0'></body></msg>.
    En bleu, c'est ce que j'envoie, et en vert ce que je reçois.
    Mon problème est que socket_read n'a pas de gestion de "fin de lecture".
    Existe-t-il une méthode pour trouver la fin de réception de la vague de donnée ?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Le dernier paramètre de socket_read sur "PHP_NORMAL_READ" ne conviendrait t'il pas dans ton cas ? (stop la lecture sur \n ou \r )
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Bonjour,

    Bah en faite ce n’est pas ton socket qui va gérer ça.
    Il est juste la pour la lecture et l'écriture après c'est à toi d'interpréter les messages et c'est pour ça que les RFC existent bon courage

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Points : 65
    Points
    65
    Par défaut
    Bonjour, merci pour vos réponses.

    J'ai remarqué que tout ce que le serveur envoyait était terminé de l'héxadécimal "00", soit "\0".

    savez vous pourquoi un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    		do 
    		{
    			$reception = socket_read($this->socket, 16);
    			$test += $reception;
    		}
    		while (!preg_match("#\\0#", $reception));
    		echo htmlspecialchars($test, ENT_QUOTES);actualiser();
    Ne fonctionne pas ? ça me sors un chiffre au lieu de tout lire jusqu'à ce fameux \0.

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    :s
    Le \0 signifie que tu es à la fin de ta chaîne de caractère c'est la base même des manipulations de chaîne donc je pense que preg ne te l’interprète pas pour ne pas dépasser la limite de ta string.
    Souvent les chaines sont terminées par un \n ou un \r\n
    Mais cela signifie juste la fin de ta ligne envoyé et donc ça ne résout pas ton problème car si le serveur t’envoie une réponse sur 2 paquets bah tu ne vas pas gérer les buffers tournant c'est pour cela que je t'ai conseillé de lire la RFC du protocole sur lequel s'appuie le serveur afin que tu puisses mettre en place une vraie gestion de ce que tu reçois.

    Et c'est grâce à cela que tu va pouvoir comprendre et gérer les messages que tu reçois.

    Maintenant il ne reste plus qu'à trouver la où les RFC sur lesquels s'appuie ton serveur (Google est ton ami)

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Points : 65
    Points
    65
    Par défaut
    Je me permet un up.
    Je n'ai toujours pas trouvé de solution à ce problème.

    Je comprends pas comment il détecte la fin de texte. J'ai l'impression qu'il sniffe le serveur.

    Sinon y'a pas la possibilité de chercher \0. Une fois qu'il est atteint, on recommence et si y'a rien qui entre on passe à la suite ?

    J'ai pu faire marcher à peu prêt comme je veux via :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (($reception = @socket_read($this->socket, 1)) != "")
    Mais c'est assez lent à traiter, car une fois qu'il a fini de lire, il ne sait pas passer à la suite sans attendre le time out. Une idée ?

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    As tu essayés ce que que je proposais dans mon post précédent ?
    Ca fait exactemement ce que tu recherche en principe (stopper la lecture sur \0 \r ou \n)
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par grunk Voir le message
    As tu essayés ce que que je proposais dans mon post précédent ?
    Ca fait exactemement ce que tu recherche en principe (stopper la lecture sur \0 \r ou \n)
    Bonjour, oui, c'est ce que j'ai essayé en premier, mais en fait ça ne fait rien du tout lorsque j'utilise ceci.

    De plus, un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (($reception = @socket_read($this->socket, 1, PHP_NORMAL_READ)) != "")
    Devrai logiquement lire jusqu'à ce qu'il n'y a plus rien, et ce peut importe le contenu, puis passer à la suite s'il rencontre \0 si j'ai bien compris.
    Hors ici, ce n'est pas le cas (pourtant il y a bien le \0 à la fin, j'en suis sur).

  9. #9
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    bonsoir,
    Pourquoi personne ne s’arrête sur ma proposition c'est ce qu'il y a de plus vivable

  10. #10
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Citation Envoyé par devoluti0n Voir le message
    Bonjour, oui, c'est ce que j'ai essayé en premier, mais en fait ça ne fait rien du tout lorsque j'utilise ceci.

    De plus, un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (($reception = @socket_read($this->socket, 1, PHP_NORMAL_READ)) != "")
    Devrai logiquement lire jusqu'à ce qu'il n'y a plus rien, et ce peut importe le contenu, puis passer à la suite s'il rencontre \0 si j'ai bien compris.
    Hors ici, ce n'est pas le cas (pourtant il y a bien le \0 à la fin, j'en suis sur).
    Tu lui donnes une limite de 1 octet à lire donc à mon avis c'est normal qu'il ne lise pas jusqu'à la fin.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Points : 65
    Points
    65
    Par défaut
    Il lit jusqu'à la fin... Mais il ne s'arrête pas de lire au \0.
    Enfin tant pis, je passe le sujet en résolu, je ferai une lecture constante et un parsing msg par msg.

    Merci quand même.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lire jusqu'a la fin de la ligne d'un fichier
    Par Jack_nicholson dans le forum SAS Base
    Réponses: 4
    Dernier message: 09/03/2011, 17h33
  2. Réponses: 23
    Dernier message: 02/04/2008, 15h39
  3. Réponses: 7
    Dernier message: 12/10/2007, 18h05
  4. Réponses: 8
    Dernier message: 09/05/2007, 17h00
  5. Comment lire jusqu'au caractère CTRL-D EOF ?
    Par AsmCode dans le forum C
    Réponses: 9
    Dernier message: 08/02/2007, 21h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo