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 :

[Système] Problème socket : script


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2002
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 99
    Par défaut [Système] Problème socket : script
    Bonjour,

    J'essaie toujours de comprendre les sockets mais ça rentre doucement.

    J'ai essayé d'écrire une petit script pour mettre en pratique mles premieres connaissances mais j'ai encore un petit bug que je n'arrive vraiment pas à résoudre.

    Le script est lancé avec par SSH, l'objectif est d'afficher dans la fenetre des navigateurs, l'heure à laquelle la dernière personne s'est connecté à la socket.

    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
     
    $address='195.195.195.195';
    $port=7235;
    $clients = array();
    $socket = socket_create(AF_INET, SOCK_STREAM, 0);
    socket_bind($socket, $address, $port);
    socket_listen($socket);
    while(true) {
         //Le code se bloque jusqu'à ce qu'une nouvelle connexion cliente est établie
         $client = socket_accept($socket);
         //Lors d'une connexion, le code reprend ici, il est temps de lire ce qu'on nous envoie
         array_push($clients, $client);
         $param = socket_read($client,2300);
         foreach ($clients as $key => $value) {
              if ( is_resource($value) ) {
                   $msg = '<script type="text/javascript">document.write(\''.date('H:i:s').'\');</script>';
                   socket_write($value, $msg, strlen($msg));
              }
         }
         //socket_close($client);
    }
    Ensuite je lance un navigateur et je tape l'adresse :
    http://195.195.195.195:7235

    Mais la page tourne dans le vide sans renvoyer aucun résultat jusqu'a ce que j'arrete le script.

    D'où vient mon erreur ?

    Merci pour votre aide

  2. #2
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Salut !

    Je ne comprends pas pourquoi tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                   $msg = '<script type="text/javascript">document.write(\''.date('H:i:s').'\');</script>';
    plutôt que simplement enfin...

    Je ne vois pas non plus très bien à quoi te sert le socket_read...

    ensuite, étant donné que tu réponds à un navigateur, il faut respecter le protocole HTTP...

    enfin, le socket_bind avec un adresse spécifique n'acceptera que les connection venant de cette adresse, pour accepter tout, il faut utiilser 0.0.0.0

    ton script devrait devenir :
    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
    $reponse = 'HTTP/1.1 200 OK'."\r\n".'Content-type: text/plain'."\r\n\r\n";
    $port=7235;
    $clients = array();
    $socket = socket_create(AF_INET, SOCK_STREAM, 0);
    socket_bind($socket, '0.0.0.0', $port);
    socket_listen($socket);
    while(true) {
         //Le code se bloque jusqu'à ce qu'une nouvelle connexion cliente est établie
         $client = socket_accept($socket);
         //Lors d'une connexion, le code reprend ici, il est temps de lire ce qu'on nous envoie
         array_push($clients, $client);
         $param = socket_read($client,2300);
         socket_write($value, $reponse, strlen($reponse));
         foreach ($clients as $key => $value) {
              if ( is_resource($value) ) {
                   $msg = '<script type="text/javascript">document.write(\''.date('H:i:s').'\');</script>';
                   socket_write($value, $msg, strlen($msg));
              } else unset($clients[$key]); //on retire le socket du tableau s'il n'est plus valide
         }
         //socket_close($client);
    }
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2002
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 99
    Par défaut
    Merci pour ta réponse,

    Je comprends pas tout donc il y a des incohérences dans le script c'est sur.

    Snin j'ai essayé ton script j'ai toujours le même problème le navigateur mouline dans le vide et n'affiche l'heure que quand j'arrive le script.

    Je sais absolument pas pourquoi.

    Sous SSH j'ai ce message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: socket_write() unable to write to socket [104]: Connection reset by peer in /home/web/mysite/socket.php on line 17

  4. #4
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    tu pourrais héberger le script sur une machine où on puisse y accèder en public, de manière à pouvoir le tester avec telnet
    (ou test le toi-même avec telnet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    telnet 195.195.195.195 7235
    )

    pour voir ce qu'il te répond, en théorie, ça devrait être
    HTTP/1.1 200 OK
    Content-type: text/plain

    H:i:s
    et si tu ouvres un second telnet (sans refermer le premier), tu devrais voir apparaître la seconde heure dans le premier...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2002
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 99
    Par défaut
    Oui avec telnet aucun problème à chaque nouvelle execution de telnet, les autres fenetres sont mise à jour.

    Par contre ça mouline sous IE.

  6. #6
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    IE doit avoir un petit problème de buffer, le buffer est trop grand pour le message, essaie d'envoyer un message plus grand que simplement l'heure (une centaine de caractères par exemple)
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/03/2007, 20h56
  2. Réponses: 1
    Dernier message: 13/09/2006, 17h10
  3. [DOS] Problème de script bat
    Par Philzegore dans le forum Windows
    Réponses: 3
    Dernier message: 04/04/2005, 13h35
  4. [Réseau] Problème socket
    Par neenee dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 18/01/2005, 16h26
  5. [Système] Lancer un script Perl
    Par ebaynaud dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 14/10/2004, 15h54

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