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

Windows Discussion :

[HTTP C++] Comment télécharger une image?


Sujet :

Windows

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Points : 54
    Points
    54
    Par défaut [HTTP C++] Comment télécharger une image?
    Bonjour,

    Dans un post précédent, je cherchais à savoir comment lancer une requête HTTP en c++. Je parviens donc maintenant à me connecter sur un serveur et lancer une requête. Ma requête consiste en fait à demander à télécharger une image qui se trouve à l'adresse 'www.monsite.com/image.gif'. Je me connecte donc sur le nom de domaine 'www.monsite.com' (connexion réussie) puis j'envoie ma requête HTTP comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    send(MySocket,"GET /image.gif HTTP/1.1\n\r\n\r",27,0);
    Le problème est que le serveur me répond avec le message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    HTTP/1.1 400 Bad Request Date: Sun, 24 Feb 2008 00:02:52 GMT Server: Apache Content-Length: 226 Connection: close Content-Type: text/html; charset=iso-8859-1  <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>400 Bad Request</title>
    </head><body>
    <h1>Bad Request</h1>
    <p>Your browser sent a request that this server could not understand.<br />
    </p>
    </body></html>
    Quelqu'un peut-t-il m'éclairer sur mon erreur? Merci!

  2. #2
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Points : 54
    Points
    54
    Par défaut
    J'ai presque resolu mon probleme. J'ai remplace mon code et ma requete par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char Request[]="GET /image.gif HTTP/1.1\r\nHost: www.monsite.com\r\n\r\n";
    send(MySocket,Request,strlen(Request));
    char Buffer[100000];
    int Size=recv(MySocket,Buffer,100000,0);
    Maintenant le serveur me renvoit le status "OK (code 200). Le probleme est que le nombre d'octets que je recois dans ma variable Size est inferieur au nombre d'octets indique dans la reponse du serveur. Plus precisement, Size=10220 alors que le serveur repond "Content-Length: 12205". Le resultat est que l'image que je recois est tronquee. Je sais que les fonctions 'send' et 'recv' ne transmettent pas toujours le nombre d'octets attendus, et qu'il faut donc contrôler systématiquement la valeur renvoyée par la fonction, mais le problème est que je reçois systématiquement 10220 octets, jamais un de plus.

    Quelqu'un peut-il m'aider?

  3. #3
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Points : 54
    Points
    54
    Par défaut
    Personne ne voit où est mon erreur?

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Et si tu refais un recv() quelques millisecondes plus tard, qu'est-ce que ça dit ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Points : 54
    Points
    54
    Par défaut
    Oui, apparement la réponse est morcelée... J'essaye de mettre au point une procédure qui fait un 'recv' jusqu'à ce que la totalité de la réponse soit reçue, et, je vous tiens au courant.

  6. #6
    Membre averti Avatar de Kujara
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 262
    Points : 358
    Points
    358
    Par défaut
    Essaye libcurl. http://curl.haxx.se/

  7. #7
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Points : 54
    Points
    54
    Par défaut
    Bon... alors j'ai réussi à recevoir mon image en entier en faisant un truc bourin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Size=0;
    int Received=0;
    
    do
       {
          Sleep(100);
          Received=recv(Client,Buffer+Size,MaxLength,0);
     
          if (Received>0)
            Size+=Received;
              
        } while (Received>0);
    Le truc bourin vient de ce 'Sleep' qui permet d'attendre quelques secondes après avoir envoyé la requête HTTP. Le problème est que si j'attends trop longtemp, la boucle do while se termine sans avoir reçu la totalité du fichier. Pareil si j'attend pas assez longtemps. Comment savoir quel est le bon timing à attendre, ça doit sûrement dépendre du serveur?

    N'y a-t-il pas un moyen de s'assurer que les fonctions send et recv ont correctement effectué le travail?

  8. #8
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Points : 54
    Points
    54
    Par défaut
    Bon... mon problème est résolu du point de vue fonctionnel, c'est à dire que je peux maintenant recevoir un fichier de n'importe quelle taille avec certitude. Le truc à savoir est qu'il ne suffit pas de boucler sur 'recv' tant que la fonction renvoie une valeur positive. Il faut continuer la boucle, même si elle renvoit la valeur -1 jusqu'à ce que l'on ait reçu la taille attendue. Pas besoin des 'Sleep'.

    Alors je ne mets pas encore le tag [RESOLU] car je trouve que cette façon d'utiliser 'recv' est un peu dégueulasse. Je n'ai trouvé aucune information sur le net qui dise qu'il faut effectivement faire comme je le fais, donc je pense qu'il doit y avoir une solution plus propre.

    Mais bon, ça marche...

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    C'est vraiment bizarre, ça...

    À moins que tu sois en non-bloquant ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    À moins que tu sois en non-bloquant ?
    Je vais vérifier ça et me documenter, car je ne connais pas trop ça.

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Normalement, si tu es en bloquant, recv() ne retourne zéro qu'une fois que "l'autre" s'est "proprement" déconnecté (et retourne une erreur en cas de déconnexion brutale).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/12/2014, 01h19
  2. Réponses: 3
    Dernier message: 15/10/2012, 15h19
  3. Réponses: 9
    Dernier message: 17/09/2009, 10h31
  4. Réponses: 4
    Dernier message: 02/06/2006, 22h46
  5. Comment afficher une image à la volée via http ?
    Par reg11 dans le forum Web & réseau
    Réponses: 4
    Dernier message: 30/06/2005, 09h44

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