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é) :
Ce code marchait bien quand j'accédais à un fichier test situé sur mon compte perso free.
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
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]
Partager