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

MFC Discussion :

[MFC][WINSOCK] Problème avec fonction recv


Sujet :

MFC

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5
    Points : 5
    Points
    5
    Par défaut [MFC][WINSOCK] Problème avec fonction recv
    Bonjour !

    Dans une application MFC, j'utilise l'API winsock pour récupérer un fichier contenu sur un serveur HTTP par une simple requête GET.

    Pour ça, je fais une boucle sur le receive, car le fichier est relativement long (ce code est réalisé dans un thread séparé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int nBytes = recv(sock, buffer, BUF_LENGTH, 0);
    while (nBytes > 0) {
      // Traitement du buffer
      nBytes = recv(sock, buffer, BUF_LENGTH, 0);
    }
    if (nBytes == 0)
      // Fini OK
    else
      // Traitement d'erreur
    Ce code marchait bien quand j'accédais à un fichier test situé sur mon compte perso free.
    Or, après avoir tenté d'y accéder sur un autre serveur (un IIS, logiquement), je me suis aperçu que le fichier se téléchargeait bien, mais le dernier recv, censé renvoyer zéro pour indiquer la fin du téléchargement, fait s'envoler le thread en fumée, et je ne sors jamais de la boucle while (vérifié par débug).

    Je me suis relativement pris la tête là-dessus, jusqu'à analyser les trames qui passaient et les différences entre les paquets envoyés par les deux serveurs, et j'en ai conclu que Free envoyait son dernier paquet avec un en-tête HTTP contenant le flag FIN, alors que le deuxième serveur non. Je suis presque certain que le problème vient de là.

    Ma question est donc : est-ce que quelqu'un verrait par hasard comment remédier à ça ? Mon fichier est bien récupéré, pas de problème là-dessus, mais je ne peux pas notifier au créateur du thread QUAND ceci est terminé, je ne sais donc pas quand je peux continuer les traitements.

    [edit]Ce message m'a semblé plus pertinent dans la section Visual C++...[/edit]

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    salut,

    pourquoi ne pas te servir des classes CHttpFile, CHttpConnection, etc ...

    Sinon, il n'y a pas un moyen de connaitre la taille du fichier ? comme ca tu boucles tant que tu n'as pas lu toute la taille...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Je ne savais juste pas que ça existait...

    Sinon, en effet, je récupérais la taille totale du fichier par l'en-tête HTTP Content-Length, mais juste afin d'indiquer l'avancement du téléchargement dans une barre de progression...
    Le problème est que ma dernière fonction recv ne renvoie pas la bonne taille, et le compte total des octets reçus n'atteint jamais la taille totale. De plus, il me faut une application robuste, et j'aimerais prévoir le cas où je n'arrive pas à récupérer le Content-Length.

    Mais merci beaucoup de l'aide, je vais chercher du côté des CHttpConnection/CHttpFile, ça m'a l'air de répondre à mon besoin...

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    Il y a plein de classes pour tous les besoins, Http, Fichiers, ftp, etc ...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Oui, c'est le principe des frameworks, donc de MFC...

    D'habitude, j'essaie de faire moins "bas niveau" que ça pour me simplifier la tâche, mais là je n'ai même pas pensé à chercher des composants évolués me simplifiant le travail. J'ai juste vu les CSocket, mais ça donnait le même résultat, donc je suis revenu en winsock.

    Allez, je finis de tester, j'édite et je passe en résolu dès que ça marche.

    [edit]Bon eh bien ça marche très bien, à part quelques erreurs qui ne lèvent apparemment pas d'exception. Résolu.[/edit]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MFC] Débutant : Problème avec OnPaint()
    Par ZaaN dans le forum MFC
    Réponses: 14
    Dernier message: 05/12/2005, 13h15
  2. Problème avec fonction
    Par Goundy dans le forum C
    Réponses: 24
    Dernier message: 01/10/2005, 20h17
  3. [MFC] [CRecordset] Problème avec Excel
    Par Yellowmat dans le forum MFC
    Réponses: 4
    Dernier message: 20/07/2005, 15h24
  4. Problème avec fonction d'envoie de mail
    Par zyg dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 23/02/2005, 08h48
  5. [Requête] Problème avec fonction "DATE_FORMAT()"
    Par sekiryou dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2005, 21h52

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