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 :

Fonction qui "se bloque"


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 Fonction qui "se bloque"
    Bonjour, toujours dans mon projet de client IRC assez particulier, je bloque sur la chose suivante.

    En fonction des messages reçus provenant du serveur distant, j'effectue diverses actions.
    Voici les parties du code interessantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    		$socket = fsockopen($server_host, $server_port, $errno, $errstr, 2);
    		if($socket)
    		{
    			//Connecté, envoies les infos de login
    			Send("PASS $server_pass \n\r"); //Le mot de passe
    			Send("NICK $nickname\n\r"); //Le pseudo
    			Send("USER $nickname hostname servername :13 0 FR 3.6.29.0\n\r");// Les infos du client W:A
    			Recieve($socket, $motd);
    			Send("LIST\n\r");
    			Recieve($socket, $chans);
    		}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    function Recieve($socket, $motd)
    {
    	while(!feof($socket)) //Tant que l'on est connecté :
    	{
    		$buffer = fgets($socket); //On récupere une ligne de données
    		$codes = explode(' ', $buffer);
    		switch($codes[1])
    		{
    			case 372:
    			for ($i = 4; $i < count($codes); $i++)
    			{
    				$motd .= $codes[$i]." ";
    			}
    			break;
     
      			case 376:
    			echo $motd;
    			break;
     
    			case 322:
    			for ($a = 3; $a < count($codes); $a++)
    			{
    				$chans .= $codes[$a]." ";
    			}
    			break;
     
    			case 323:
    			echo "$chans</br>";
    			break;
    		}
    		actualiser();
    	}
    }
    Seulement, comme on le voit sur le snipet du haut, je fais appel 2x à la fonction Recieve, sauf que dés qu'elle a été utilisée une 1ere fois, il semblerai qu'elle ne se remette pas disponible.

    J'explique rapidement le principe.
    1) On se log, on fait appel à la fonction recieve pour récupérer le MOTD.
    2) On demande la liste des canaux, on fait appel à la fonction recieve pour la récupérer... Sauf que le second appel ici n'est pas pris en compte car le 1er appel de la fonction semble tourner à l'infini.

    Comment arriveriez vous à vous en sortir ? Merci d'avance !

  2. #2
    Membre habitué Avatar de Couz02
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 232
    Points : 182
    Points
    182
    Par défaut
    A mon avis tu reste bloqué au niveau de ta boucle while.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while(!feof($socket)) //Tant que l'on est connecté :
    {
        ...;
    }
    Tu luis dis : tant que tu es connecté, tu fais ça mais il est toujours connecté donc reste dans cette boucle là et te ça te permet pas de passer à ton :


  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
    Merci pour ta réponse, néanmoins ça je le sais très bien, et ça ne m'est pas très utile... .

    Il faut que je trouve un moyen pour rester connecter, et en même temps pour recevoir mes infos...

    parcque le problème ne vient pas forcément de ça mais plutôt du fgets qui ne redevient pas accessible.

  4. #4
    Membre averti Avatar de BornBanane
    Homme Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 284
    Points : 416
    Points
    416
    Par défaut
    Je ferais plutôt le while dans le 1er snippet, comme cela tes fonctions marcherons tout le temps.
    Bien sur il faut adapter tout le reste.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    		$socket = fsockopen($server_host, $server_port, $errno, $errstr, 2);
    		while(!feof($socket)) //Tant que l'on est connecté :
     
    		{
    			//Connecté, envoies les infos de login
    			Send("PASS $server_pass \n\r"); //Le mot de passe
    			Send("NICK $nickname\n\r"); //Le pseudo
    			Send("USER $nickname hostname servername :13 0 FR 3.6.29.0\n\r");// Les infos du client W:A
    			Recieve($socket, $motd);
    			Send("LIST\n\r");
    			Recieve($socket, $chans);
    		}

  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
    Effectivement, mais la il va envoyer tout ce qui est dans la boucle while à l'infini .

  6. #6
    Membre habitué Avatar de Couz02
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 232
    Points : 182
    Points
    182
    Par défaut
    Citation Envoyé par devoluti0n Voir le message
    Merci pour ta réponse, néanmoins ça je le sais très bien, et ça ne m'est pas très utile... .

    Il faut que je trouve un moyen pour rester connecter, et en même temps pour recevoir mes infos...

    parcque le problème ne vient pas forcément de ça mais plutôt du fgets qui ne redevient pas accessible.
    Oui mais tu ne sortira jamais de ta fonction recieve car tu es en boucle infinie donc tu ne passera pas à send.

    Puis de toute façon tu es toujours connecté puisque tu ne ferme pas ta socket donc pourquoi pas faire un simple if dans ta fonction recieve ?

    Si je me trompe encore, je comprend pas ce que tu veux faire alors, désolé.

  7. #7
    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
    Non tu as tout à fait raison, je le voyais pas sous cet angle.

    Pour le if je vois pas ce que je pourrai y mettre. J'ai un pote qui me flood pour me dire d'utiliser un thread mais bon....

    Pour ce if tu n'as pas un éxemple histoire de m'éclairer s'il te plait ?

  8. #8
    Membre habitué Avatar de Couz02
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 232
    Points : 182
    Points
    182
    Par défaut
    Citation Envoyé par devoluti0n Voir le message
    Non tu as tout à fait raison, je le voyais pas sous cet angle.

    Pour le if je vois pas ce que je pourrai y mettre. J'ai un pote qui me flood pour me dire d'utiliser un thread mais bon....

    Pour ce if tu n'as pas un éxemple histoire de m'éclairer s'il te plait ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function Recieve($socket, $motd)
    {
        if($socket)
        {
            // Ton switch case
        }
        else
        {
            // Message d'erreur suite à une connexion non établie
        }
    }
    Voilà tout simplement.

  9. #9
    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, effectivement, je peux utiliser plusieurs fois la fonction recieve, mais le probleme c'est qu' en toute logique il me fait en chaine tant qu'il est connecté...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    			Send("PASS $server_pass \n\r"); //Le mot de passe
    			Send("NICK $nickname\n\r"); //Le pseudo
    			Send("USER $nickname hostname servername :13 0 FR 3.6.29.0\n\r");// Les infos du client W:A
    			Recieve($socket, $motd);
    			Send("LIST\n\r");
    			Recieve($socket, $chans);
    		}
    Que je peux forcer à faire une fois en utilisant des booléens mais vu le nombre d'instructions que j'ai encore à faire, je vais vite, très vite être dépassé.
    Le problème est que ça n'engendre ce problème la maintenant :

    http://www.developpez.net/forums/d67...s/#post3961355

    Merci tout de même, on avance je le sens ^^ .

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

Discussions similaires

  1. Form bloquée et fonction qui boucle
    Par bgcode dans le forum VB.NET
    Réponses: 2
    Dernier message: 28/08/2007, 14h21
  2. Réponses: 3
    Dernier message: 22/07/2005, 16h16

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