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. ###raw>post.musername###
    Membre averti
    [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
      0  0

  2. ###raw>post.musername###
    Expert éminent
    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);
    ?>
      0  0

  3. #3
    Membre averti
    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. ###raw>post.musername###
    Expert éminent
    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
      0  0

  5. #5
    Membre averti
    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
    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
    oui désolé, je viens juste de voir que j'avais fait mon boulet là...

###raw>template_hook.ano_emploi###