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 :

[Réseau] Socket_read, résultat à la ligne ?


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 [Réseau] Socket_read, résultat à la ligne ?
    Bonjour !

    J'aimerai que l'on m'éxplique comment faire pour séparer les diférents blocs que l'on me revois avec socket_read (que je récupere comme sa):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    echo "Réponse  : <br/>\n\n";
    		while ($out = socket_read($socket, 2048)) {
        		echo "$out <br/>"; 
    		}
    car la je reçoit tout suite à suite, et c'est donc trés désordoné.

    Donc ma question en clair, c'est comment faire aller à la ligne les trés nombreux éléments ce que je reçoit, et ce de maniere automatique.

    Merci .

  2. #2
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Je ne suis pas sur que ma solution soit bonne, mais peut être en essayant un fopen/fget/fread plutot qu'un fsock...

    Sinon, ton probleme est un probleme de protocole... Pour bien faire, il faudrait que tu sache la taille du packet que tu attends (auquel cas tu lis tant que ton buffer ne fait pas la taille attendue en mettant en parametre pour le read la taille restante du packet attendu a chaque itération de la boucle...

    Sinon, suivant ton type de données transféré, tu peux mettre des marqueurs de fin de chaines (0x00 par exemple si c du texte)

  3. #3
    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
    En fait je reçoit juste du texte.
    Le probleme c'est que la taille de ce texte varie, mais chaque début de ligne est introduit par "*** untruc"

    "***" étant un nombre et "untruc" correspond à la valeur d'une variable défini dans mon script.


    en fait sa correspond à un MOTD qu eme renvoie un serveur irc.

    ps: Comment puis-je récuperer la taille du paquet ?

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    La taille du paquet attendu doit se détermine par le protocole : c'est une règle, une convention définie arbitrairement par le créateur du programme (ou normalisée, style RFC).

    Pour l'IRC, autant que je me souvienne, il n'y a pas de marqueur de fin de chaine. Il y a donc fort à parier - dans le mesure ou ce sont des string de taille varibales transmises - que la taille de chaque packet attendu soit indiquer au début de chaque message.
    Pour répondre à cette question, il faut donc regarder la doc du protocole IRC.

    Désole de pas pouvoir t'aider d'avantage !

  5. #5
    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
    Y'a pas de mal, peut être que sa correspond au chifre introduisant chaque méssage .

    mais je vois pas comment récuperer ces valeurs .

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Si tes messages commencent par un chiffre, c'est très probablement soit la taille, soit l'ID du message...
    Si c'est bien la taille (tu devrais pas avoir de mal a imaginer des test pour tester ça), alors tu fait un read sur ton socket de cette taille.
    Si la taille lu est inférieur à ce que tu attendais, tu boucle sur ton readsock, en demandant la taille total - taille deja récupéré et tu concatene ce que tu lis dans un buffer jusqu'a ce que ça fasse la taille désirée...

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Il y a un forum dédié à IRC où ils seront surement à même de vous répondre.

    Mais en cherchant dans la RFC correspondante (n°1459), on y trouve :
    375 RPL_MOTDSTART
    ":- <serveur> Message of the day - "
    372 RPL_MOTD
    ":- <texte>"
    376 RPL_ENDOFMOTD
    ":End of /MOTD command"

    Lorsqu'il répond à un message MOTD et que le fichier MOTD est trouvé, le fichier est affiché ligne par ligne, chaque ligne ne devant pas dépasser 80 caractères, en utilisant des réponses au format RPL_MOTD. Celles-ci doivent être encadrées par un RPL_MOTDSTART (avant les RPL_MOTDs) et un RPL_ENDOFMOTD (après).
    (les premiers chiffres étant le code de l'erreur)

  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
    Etant débutant je suis un peu perdu.



    Je ne sais pas comment faire , par contre mon programe pour sniffer les paquets le fait trés bien xD.

    Cepandant il semblerai que chaque méssage soit introduit par:
    ":adresseduserveur xxx pseudo :" (xxx, num du code méssage)
    est il possible de faire disparaitre ceci, et de dire que si cette éxpréssion est présente, alors retour à la ligne ?



    Je profite de mon post pour vous poser deux autres questions :

    Savez vous comment faire pour laisser une connexion ouverte, et faire plusieurs actions diférentes selons certain criteres ?
    Je crois qu'il faut utiliser des fonctions mais j'y comprends pas tout.
    Je suis perdu, j'étais habitué à mes belles petites procédures delphi.


    Et savez vous comment faire en sorte que mon while s'arrete lorsqu'il ne trouve plus rien à lire sur un certain laps de temps ?
    Car la mon while lis en ce que je recois mais c'est trés long, car il attends les 30 secondes définies dans le php.ini.
    Hors ce n'est pas ce dont j'ai besoin :
    Il faut que mon socket reste ouvert mais que mon echo se termine quand il n'y a plus rien à recevoir.


    Voilà, merci pour vos éxplications

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Citation Envoyé par devoluti0n
    Cepandant il semblerai que chaque méssage soit introduit par:
    ":adresseduserveur xxx pseudo :" (xxx, num du code méssage)
    est il possible de faire disparaitre ceci, et de dire que si cette éxpréssion est présente, alors retour à la ligne ?
    Avec une expression régulière, des fonctions comme strpos ?

    Citation Envoyé par devoluti0n
    Savez vous comment faire pour laisser une connexion ouverte, et faire plusieurs actions diférentes selons certain criteres ?
    Je crois qu'il faut utiliser des fonctions mais j'y comprends pas tout.
    Je suis perdu, j'étais habitué à mes belles petites procédures delphi.
    Elle est ouverte jusqu'à ce que vous la fermiez ou bien que la fin du script soit atteinte (PHP la ferme probablement de lui-même). Pour associer une action à des critères utiliser des conditions (if/elseif/else ou switch éventuellement) sur les réponses reçues.

    Citation Envoyé par devoluti0n
    Et savez vous comment faire en sorte que mon while s'arrete lorsqu'il ne trouve plus rien à lire sur un certain laps de temps ?
    Car la mon while lis en ce que je recois mais c'est trés long, car il attends les 30 secondes définies dans le php.ini.
    Hors ce n'est pas ce dont j'ai besoin :
    Il faut que mon socket reste ouvert mais que mon echo se termine quand il n'y a plus rien à recevoir.
    Vous faites un(des) test(s) et mettez fin à l'itération avec l'instruction break.

  10. #10
    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
    Merci pour toutes ces réponses !

    J'ai suivi vos instuctions et par la suite sa deviens donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $server = "monserver.com";
    $pattern  = "/:$server/";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //Récéption		
    echo "Réponse  : <br/>\n\n";
    		while ($out = socket_read($socket, 1024)) {
       			if(preg_match($pattern, $out))	{
    			echo $motd = str_replace($pattern,"", $out);        		
       			}		
     
    		}
    mais sa remplace pas .

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    str_replace n'effectue pas de remplacement en fonction d'un motif mais en fonction d'une chaîne (correspondance exacte si vous préférez). Par conséquent les délimiteurs (les slashs) sont de trop pour commencer. Sachez qu'il existe une fonction de remplacement qui effectue les remplacements suivant un motif : preg_replace (eregi?_replace étant à oublier). A vous de voir ce qui vous paraît le plus approprié par la suite.

  12. #12
    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
    Oh merci, tout est parfais, merci beaucoup pour votre aide et votre patience !

    Je passe le sujet en résolu, merci encore.

  13. #13
    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
    Permetez moi de rajouter une question traitant des sockets.

    Comment faire pour laisser une connexion ouverte, car dés la fin du script, même sans socket_close, je perds la connexion .

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    C'est impossible à faire en PHP puisque PHP ferme les connexions qui ne l'auraient pas été explicitement à la fin du script/processus comme il le fait avec d'autres ressources (ZipArchive, MySQL, ...). PHP n'offre aucune notion de persistance surtout sur des "objets" (rien à voir avec la POO) de type ressource.

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

Discussions similaires

  1. Une erreur 233 de ms sql server
    Par Hokage dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 05/10/2009, 18h40
  2. Erreur 233 sous sql server
    Par brajae85 dans le forum Oracle
    Réponses: 3
    Dernier message: 18/05/2009, 17h12
  3. Réponses: 2
    Dernier message: 05/10/2004, 23h43

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