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 :

[Socket] Les débuts c'est pas rose...


Sujet :

Langage PHP

  1. #1
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2004
    Messages : 275
    Points : 312
    Points
    312
    Par défaut [Socket] Les débuts c'est pas rose...
    Bonjour !

    J'aimerais pouvoir me connecter à partir de mon site chez moi par l'intermédiaire de no-ip afin de récupérer des informations. Je dois donc pour cela créer une socket qui me permette de lire le résultat d'une requete HTTP vers mon serveur local.

    Voici mon code :
    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
     
    <?
     
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    socket_bind($socket,"infoworld.no-ip.org");
     
    socket_connect($socket, gethostbyname('infoworld.no-ip.org'),getservbyname('www','tcp'));
    socket_write($socket,"GET / HTTP/1.1\r\n\r\nHost: http://infoworld.no-ip.org\r\n\r\n");
     
    while ($ligne=socket_read($socket,4096,PHP_NORMAL_READ))
    {
        echo "\"$ligne\"<br>";
        if (ereg('title',$ligne))
        {
            $played = ereg_replace(".*title=([^ ]).*","\\1",$ligne);
        }
    }
    socket_close($socket);
    ?>
    Donc deja là il y a deux problèmes :
    - le résultat des echo $ligne me renvoit un HTTP BAD REQUEST.
    - le while au lieu de se terminer proprement me donne une erreur php qui me dit que la connexion est close.

    Voici le retour généré, parce qu'un exemple vaut 1000 explications :

    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
    "HTTP/1.1 400 Bad Request "
    " "
    "Date: Mon, 15 May 2006 21:08:52 GMT "
    " "
    "Server: Apache "
    " "
    "Content-Length: 285 "
    " "
    "Connection: close "
    " "
    "Content-Type: text/html; charset=iso-8859-1 "
    " "
    " "
    " "
    " "
    " "
    " "
    " "
    "Bad Request
    
     "
    "Your browser sent a request that this server could not understand.
    "
    "
     "
    " "
    "Apache Server at infoworld Port 80 "
    ""
    
    Warning:  socket_read() unable to read from socket [104]: Connection reset by peer in /var/www/localhost/htdocs/lapsus/fluxInfo.php on line 9
    
    
    Si vous pouviez m'éclairer ça serait super sympa :-)

    Merci infiniment

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

    Informations forums :
    Inscription : janvier 2003
    Messages : 6 045
    Points : 8 862
    Points
    8 862
    Par défaut
    pour séparer les Headers il ne faut qu'un seul saut de ligne, de plus sur un socket client, bind est totalement inutile :
    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
    <?
     
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
     
    socket_connect($socket, gethostbyname('infoworld.no-ip.org'));
    socket_write($socket,"GET / HTTP/1.1\r\nHost: http://infoworld.no-ip.org\r\n\r\n");
     
    while ($ligne=socket_read($socket,4096,PHP_NORMAL_READ))
    {
        echo "\"$ligne\"<br>";
        if (ereg('title',$ligne))
        {
            $played = ereg_replace(".*title=([^ ]).*","\\1",$ligne);
        }
    }
    socket_close($socket);
    ?>
    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 (en bas)

  3. #3
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2004
    Messages : 275
    Points : 312
    Points
    312
    Par défaut
    Re Swoög, et merci

    Par contre j'ai toujours le même problème...
    J'ai remis le 3e paramètre que tu as enlevé dans le socket_connect, apache me dit qu'il est obligatoire, pour du AF_INET.


    Je te repaste pas le résultat renvoyé, c'est exactement le même, sauf que maintenant c'est ligne 9 le problème

    Ca peut pas venir de la conf de php par hasard ?

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

    Informations forums :
    Inscription : janvier 2003
    Messages : 6 045
    Points : 8 862
    Points
    8 862
    Par défaut
    OK, lol, j'ai compris XD encore un petit bug du protocole HTTP que j'avais pas vu, faut pas spécifier le http:// dans le Host
    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
    <?
     
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
     
    socket_connect($socket, gethostbyname('infoworld.no-ip.org'),getservbyname('www','tcp'));
    socket_write($socket,"GET / HTTP/1.1\r\nHost: infoworld.no-ip.org\r\n\r\n");
     
    while ($ligne=socket_read($socket,4096,PHP_NORMAL_READ))
    {
        echo "\"$ligne\"<br>";
        if (ereg('title',$ligne))
        {
            $played = ereg_replace(".*title=([^ ]).*","\\1",$ligne);
        }
    }
    socket_close($socket);
    ?>
    PS : pour le troisième param de socket_connect, je ne pensais pas qu'il était obligatoire, j'aurais du relire la doc, ça fait un bail que j'ai plus toucher aux sockets PHP
    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 (en bas)

  5. #5
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2004
    Messages : 275
    Points : 312
    Points
    312
    Par défaut
    hmmm ça avance :-)
    J'ai toujours le warning généré par le while, mais bon ça je verrai...
    Par contre, là sur l'adresse originale ça passe, j'ai une 302 found (une redirection, qui se fait effectivement en temps normal), mais si je demande une page particulière, genre ......org/test/test.htm, j'ai une 404, operation not supported.

    socket_write($socket,"GET / HTTP/1.1\r\nHost: infoworld.no-ip.org/test/test.htm\r\n\r\n");
    C'est pas là qu'on décide de la page à aller voir ?

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

    Informations forums :
    Inscription : janvier 2003
    Messages : 6 045
    Points : 8 862
    Points
    8 862
    Par défaut
    non, tu devrais te trouver une RFC sur le protocole HTTP....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    socket_write($socket,"GET /test/test.htm HTTP/1.1\r\nHost: infoworld.no-ip.org\r\n\r\n");
    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 (en bas)

  7. #7
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2004
    Messages : 275
    Points : 312
    Points
    312
    Par défaut
    oui désolé, je viens juste de voir que j'avais fait mon boulet là...

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/02/2011, 13h01
  2. Réponses: 2
    Dernier message: 28/08/2006, 16h00
  3. Réponses: 4
    Dernier message: 22/05/2006, 11h25
  4. Réponses: 2
    Dernier message: 19/10/2005, 20h39

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