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 :

Problème de Sockets


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Points : 59
    Points
    59
    Par défaut Problème de Sockets
    Salut !

    J'ai un problème avec mon script.
    VOici l'erreur :
    Warning: socket_read() unable to read from socket [0]: Opération réussie. in c:\program files\easyphp1-8\www\sockets\test\action2.php on line 58

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    <?php
    
    if (isset($_POST['prix']))
    {
    $address='localhost';
    $service_port=2006;
    error_reporting(E_ALL);
    echo "<h2>Connexion TCP/IP</h2>\n";
    
    /* Cree une socket TCP/IP. */
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die ("DTC");
    if ($socket <= 0) {
        echo "socket_create() a échoué : raison :  " . socket_strerror ($socket) . "\n";
    }
    
    $result = socket_bind($socket, $address) or die ("DTC encore");
    if (!$result) {
        echo "socket_connect() a échoué : raison : ($result) " . socket_strerror($result) . "\n";
    }
    
    socket_connect($socket, $address, $service_port);
    
    $in = "coucou";
    $out = '';
    
    $verdict=socket_write($socket, $in, strlen($in)) or die ("DTC !!!!!");
    echo $verdict;
    if ($verdict<=0)
    {
    	echo "DTC";
    }
    
    if($buffer=socket_read($socket,256,PHP_NORMAL_READ)){
         echo $buffer;
       }
    
    socket_close($socket) or die ("Erreur encore et toujours");
    }
    
    ?> 
    <html>
    <body>
    <form id="form1" name="form1" method="post" action="action2.php">
      <label>
      <input type="text" name="prix" />
      </label>
      <label>
      <input type="submit" name="Submit" value="Envoyer" />
      </label>
    </form>
    </body>
    </html>
    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Pour lire la réponse sur ton socket, as-tu essayé de boucler:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ($out = socket_read($socket, 2048)) {
       echo $out;
    }
    Je suppose qu'un deamon/service est à l'écoute sur le port 2006 et qu'il renvoie quelque-chose?

  3. #3
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par ripat
    Pour lire la réponse sur ton socket, as-tu essayé de boucler:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ($out = socket_read($socket, 2048)) {
       echo $out;
    }
    Je suppose qu'un deamon/service est à l'écoute sur le port 2006 et qu'il renvoie quelque-chose?
    Oui j'ai essayé et oui il y a un deamon...

    Mais depuis j'ai modifié pas mal le code (désolé je n'avais pas vu la réponse... ) en reprenant le tutoriel de developpez !



    Voilà mon fichier qui démarre le serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?
    	require_once 'config.php';
    	require_once 'Communication.php';
    	//Normalement le chat est démarré via php-cli, donc cette directive n'est pas indispensable
    	//Cependant on peut démarrer le chat via le browser, et là, elle le devient
    	ini_set("max_execution_time",0);
    	//Instanciation de la classe chat_server
    	$serveur = new Serveur();
    	//On assigne le html du fichier config à la propriété html de l'objet
     
    	//On démarre le serveur de chat
    	$serveur->Start($address,$port);
    ?>
    Le fichier de config (au cas où...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?php $address='localhost';
    $port=9814; ?>
    et le fichier client qui lance la demande par sockets :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <?php
    require_once 'config.php';
    //Demande de Communication 
    if (isset($_POST['montant']))
    {
    	define('HEADER',3);
    	//Le fichier de config contient les variables principales telles que le port et l'adresse de l'hôte
    	require_once 'config.php';
     
    	if(!empty($_POST['montant']))
    	{
    		$montant=$_POST['montant'];
     
    		 //Creation de la socket
    		 $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die('Création de socket refusée');
     
    		//Connexion au serveur
    		 socket_connect($sock,$address,$port) or die('Connexion impossible');
     
     
    		//Codage de la longueur du message
    		 $header=sprintf('%03d',strlen($montant));		
    		//Construction du paquet à envoyer au serveur
    		 $paquet=$header.$montant;		
    		//Calcul de la longueur du paquet
    		 $write_len=strlen($paquet)+HEADER;
     
     
    		//Ecriture du paquet vers le serveur
    		 socket_write($sock,$paquet,$write_len) or die ("Erreur lors de l'Ecriture");
     
    		//Fermeture de la connexion
    		 socket_close($sock) or die ("Erreur lors de la Fermeture");
    	}
     
    	header ("Location: http://".$address.":".$port."/");
     
    }
    ?>
    <form action="action.php" method="post" name="formajout">
    Montant : <input type="text" name="montant"/><input type="submit" name="valider"/>
    </form>
    Ce dernier ne fait qu'envoyer la valeur saisie.

    J'ai cependant une erreur à son exécution lors de la fermeture de la socket...

    Merci de votre aide !
    Niouts

  4. #4
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Points : 59
    Points
    59
    Par défaut
    Mon problème précédent a été résolu...
    enfin plus ou moins puisque j'utilise socket_shutdown();

    Si j'ai d'autres problèmes je vous tiens au courant

  5. #5
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Points : 59
    Points
    59
    Par défaut
    Je n'arrive pas à voir si mon serveur recoit les messages que mon client lui envoie.

    Revoici mon Serveur après quelques modifications :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    <?
    /*
    Presque toutes les propriétés de la classe ont une valeur par défaut
    vous pouvez bien entendu les changer dans le script start_chat.php en
    spécifiant l'instance de l'objet suivi de la propriété $objet->propriété=valeur.
    */
    class Serveur{
    //Nombre de connexions concurrentes au maximum
         var $max_clients=1;//10;
    //Un tableau qui contiendra les ID de sockets de tous les clients connectés
         var $clients;//=array();
    //La socket "maître" sur laquelle le serveur écoute
         var $socket=null;
    //Contiendra l'id de chaque nouvelle connexion
         var $client=null;
    //Contient un message à afficher lorsqu'une connexion est refusée
         var $denied;
    //0=afficher les infos sur l'écran, 1=enregistrer les log dans un fichier
         var $log=0;
    //Nom du fichier log où stocker les infos
         var $logfile='ChatServerLog.log';
    //Ressource du fichier log
         var $fp_log;
    //Contient l'en-tête html à envoyer à chaque nouveau client
         var $html;
    //Si un pseudo est déjà pris, envoyer ce message au client avant de refuser sa connexion
         var $Already_In_use;
    //Type d'info que l'on envoie au(x) client(s)
         var $write_type=0;
     
     
    //Méthode qui démarre le serveur
         function Start($address,$port)
    	 {
    		  $this->socket = socket_create(AF_INET, SOCK_STREAM, 0);
    		  //on lie la ressource sur laquelle le serveur va écouter
    		  socket_bind($this->socket, $address, $port) or die($this->destroy(null));
    		  //On prépare l'écoute
    		  socket_listen($this->socket) or die ("Erreur d'Ecoute !");
     
    		  //Boucle infinie car le serveur ne doit s'arrêter que si on lui demande
    		  while(true)
    		  {
    		   //Le code se bloque jusqu'à ce qu'une nouvelle connexion cliente est établie
    			//echo "Attente...<br/>";
    			$this->client=socket_accept($this->socket);
    		   //Lors d'une connexion, le code reprend ici, il est temps de lire ce qu'on nous envoie
    			//echo "Lecture...<br/>";
    			$this->read_write($this->client);
    		  }
         }
     
    //Cette méthode lit les données reçues par un client
         function read_write()
    	 {
    		//L'en-tête fait 3 bytes, donc on lit 3 bytes et on vérifie s'il s'agit d'une connexion
    		$input = socket_read($this->client, 3);
     
                    socket_close($this->socket);
    		header("Location: ../");	        		
            }
     
    }
     
    ?>
    Seules les méthodes utilisées ont été indiquées...
    la redirection ne fonctionne pas mais vous pourrez peut-être m'aider !

  6. #6
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Points : 59
    Points
    59
    Par défaut
    Je suis désolé après redémarrage de la machine et retest ca marche...

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

Discussions similaires

  1. Problème de sockets
    Par the_penguin dans le forum Réseau
    Réponses: 8
    Dernier message: 13/04/2006, 19h19
  2. Problême de Socket avec un applet java (RMI/policy)
    Par Vesperal dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 12/04/2006, 12h00
  3. Réponses: 2
    Dernier message: 26/03/2004, 09h15
  4. [Kylix] Problème de socket
    Par RaygKross dans le forum EDI
    Réponses: 1
    Dernier message: 01/03/2004, 19h41
  5. Mysql ne se lance pas problème de socket
    Par Riko dans le forum Installation
    Réponses: 5
    Dernier message: 05/02/2004, 09h28

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