Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SFML][Sockets] Requêtes HTTP

Réponse incomplète !

Sujet résolu
    24 mars 2008 à 11:53:58

    Bonjour tous les Z€R0's !

    Je viens de suivre le Tuto des requêtes <acronym title="HyperText Transfer Protocol ">HTTP</acronym> et le tuto du module réseau de la SFML.
    J'avoue que j'ai quelques problèmes

    (Si je poste un topic, c'est que j'ai tout essayé, j'ai cherché sur le forum (D'ailleurs j'ai trouvé ce topic mais c'est les Sockets UNIX) mais rien n'y fait)

    Mon problème



    Donc, voilà mon code:

    1. #include <SFML/Network.hpp>
    2. #include <iostream>
    3. #include <sstream>
    4. #include <string>
    5. #include <conio.h> // Pas portable mais bon
    6. #define MAX_CONTENU 5000
    7. using namespace std;
    8. char ToLower(char);
    9. void DoClientTCP(unsigned short Port)
    10. {
    11.     sf::IPAddress Ip;
    12.     sf::SocketTCP Client;
    13.     string GPH, Connexion, Requete, Site;
    14.     char Buffer[MAX_CONTENU] = {0};
    15.     size_t OctetsHead = 0;
    16.     // Demande à l'utilisateur d'entrer l'adresse IPv4
    17.     do
    18.     {
    19.         cout << "Entrez l'adresse ou l'IPv4 du serveur HTTP: ";
    20.         cin >> Site;
    21.         Ip = Site;
    22.     }
    23.     while (!Ip.IsValid());
    24.     cout << "Tentative de connexion au serveur a l'adresse '" << Ip << "' depuis le port " << Port << endl;
    25.     // Si on a pas pu se connecter à l'hôte ...
    26.     if (!Client.Connect(Port, Ip))
    27.     {
    28.         cerr << "Impossible de se connecter a l'hote ..." << endl;
    29.         return;
    30.     }
    31.     cout << "Connexion reussie." << endl << endl;
    32.     cout << "Informations sur la connexion: " << endl;
    33.     cout << "Port: " << Port << endl;
    34.     cout << "Adresse Ip: " << Ip << endl;
    35.     cout << endl;
    36.     do
    37.     {
    38.         cout << "Voulez vous que la connexion reste maintenue ? (Oui - Non) ";
    39.         cin >> Connexion;
    40.     }
    41.     while (Connexion != "Oui" && Connexion != "Non");
    42.     Connexion = (Connexion == "Oui") ? "Keep-Alive" : "Close"; // Keep-Alive ou sinon Close
    43.     for(int i = 0; i < Site.size(); ++i)
    44.     Site[i] = ToLower(Site[i]);
    45.     Requete = "GET / HTTP/1.1\r\n";
    46.     Requete+= "Host: " + Site + "\r\n";
    47.     Requete+= "User-Agent: Me\r\n";
    48.     Requete+= "Connection: " + Connexion + "\r\n";
    49.     Requete+= "\r\n";
    50.     cout << endl;
    51.     cout << "Voici la requete HTTP demandee: " << endl << endl;
    52.     cout << Requete; // On affiche la requete demandee
    53.     cout << "Envoi de la requete ..." << endl;
    54.     // Requete.size() + 1 est l'équivalent de sizeof(Requete.c_str())
    55.     if (Client.Send(Requete.c_str(), Requete.size() + 1) != sf::Socket::Done)
    56.     {
    57.         cerr << "Impossible d'envoyer la requete " << endl;
    58.         return;
    59.     }
    60.     cout << "Envoi de la requete reussi." << endl;
    61.     cout << "Voici la reponse:" << endl << endl;
    62.     sf::Socket::Status Etat;
    63.     do
    64.     {
    65.         Etat = Client.Receive(Buffer, MAX_CONTENU, OctetsHead);
    66.         if ( Etat != sf::Socket::Done)
    67.         {
    68.             return;
    69.         }
    70.             cout << Buffer;
    71.     }
    72.     while (MAX_CONTENU > OctetsHead);
    73. }
    74. int main(void)
    75. {
    76.     do
    77.     {
    78.     cout << "Le port 80 va etre utilise" << endl;
    79.     DoClientTCP(80);
    80.     _getch();
    81.     system("CLS");
    82.     } while(true);
    83.     return 0;
    84. }
    85. char ToLower(char c)
    86. {
    87.     if(c >= 'A' && c <= 'Z')
    88.     return (c - 'A' + 'a');
    89.     return c;
    90. }


    Je fais une requete HTTP normale te tout mais la réponse est incomplete ! Je veux dire Qu'il ne m'envoye pas touut le contenu ! Et ça change tout le temps, Parfois moi d'un quart de la page entière, des fois 3/4 etc...

    Avez vous une idée pour que mon problème soit résolu ? ^^

    Mes questions


    • Est ce possible de faire une allocation dynamique, de façon à ce qu'on a plus besoin de se soucier de la taille du tableau de char ?
    • Est ce possible de mettre la réponse du serveur dans un std::string ? J'ai fouillé partout mais ...



    Merci de vos réponses !
    (Enjoy the SdZ ! :p )
    • Partager sur Facebook
    • Partager sur Twitter
      24 mars 2008 à 14:59:58

      Merci je vais voir, je vous tiens au courant

      EDIT: Ca marche !!! J'ai modifié le code comme ceci :

      1. std::string Reponse;
      2.     do
      3.     {
      4.         Client.Receive(Buffer, sizeof(Buffer), OctetsHead);
      5.         if(OctetsHead > 0)
      6.         {
      7.             Buffer[OctetsHead] = '\0';
      8.             Reponse.append(Buffer);
      9.         }
      10.         else if(OctetsHead < 0)
      11.         {
      12.             return;
      13.         }
      14.     } while(OctetsHead > 0);


      Mais je ne comprend toujours pas pourquoi ça marche. J'ai fait il y a quelques heures un script qui ressemble à ça et qui ne marchait pas (Désolé mais le script je ne l'ai plus !)

      En tout cas UN GRAND MERCI !!

      Je mets en résolu !!!!!
      • Partager sur Facebook
      • Partager sur Twitter
        24 mars 2008 à 17:06:18

        Sauf que les fonctions de SFML sont un peu différentes des fonctions sockets. Ici il ne faut pas tester OctetsHead (qui ne sera jamais négatif -- c'est un entier non signé), mais plutôt le retour de la fonction Receive.

        Enfin, pour être plus précis, le retour de Receive indiquera les éventuelles erreurs, et tester OctetsHead == 0 te donnera la fin de la réception.

        Voir la doc et les tutos pour plus de détails ;)
        • Partager sur Facebook
        • Partager sur Twitter
          25 mars 2008 à 10:10:08

          Merci pour votre aide, je verrais la Doc ! :D
          • Partager sur Facebook
          • Partager sur Twitter

          [SFML][Sockets] Requêtes HTTP

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown