shocknurris
Messages postés4Date d'inscriptionmercredi 11 mai 2005StatutMembreDernière intervention11 mai 2005
-
11 mai 2005 à 10:48
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 2012
-
11 mai 2005 à 19:47
Bonjour a tous,
effectivement je suis au bord du suicide, nan quand meme pas, mais j'en
dors plus tellement je ne trouve pas de solution et ne comprend pas.
Bon déja, droit au but mon bout de code :
---------------------------------
char *buffer;
buffer=(char *)malloc(sizeof(char)*16581375);
erreur=send(sock,requete,strlen(requete),0);
if(erreur!=SOCKET_ERROR)
{memset(buffer,0,16581375);
ret=recv(sock,buffer,16581375,0);
if(ret>0)
{
buffer[ret] = '\0';
printf("%s",buffer);
}}
---------------------------------
La variable "requete" contient une requete http de type GET,
les données s'envoient et je les recoits et mon petit code comme vous le voyez affiche la réponse du serveur.
Le problème c'est lorsque je demande le "téléchargement" d'une page de
15000 octets par exemple il refuse de stocker plus de 8000 octets et ca
me bloque complétement dans mon programme, car j'ai besoin de "recevoir
toute la page".
La variable ret qui m'indique le nombre de caractères recus a bien
comme valeur 15000 (donc 15000 octets recus) mais le buffer n'en
contient que 8000 (alors qu'il peut contenir 16581375 octets).
J'ai exploré quelques pistes, et ca ne vient pas d'un probleme a
l'affichage. Peut etre d'un probleme d'allocation de mémoire, je sais
pas trop.
Pour infos si ca peut aider, je compile avec BCC (borland compiler (freecommandlinestools) et je suis sous windows xp sp2.
Si quelqu'un trouve rien qu'une piste, ca serait un énorme soulagement,
car j'ai beau regarder d'autres codes du meme genre et personne semble
avoir ce problème.
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 11 mai 2005 à 12:46
Salut,
C'est pas vraiment un probleme, ca vient du protocol tcp.
C'est a toi (ton prog) de reappeler recv() tant que tu n'a pas recus autant d'octets que tu souhaites.
shocknurris
Messages postés4Date d'inscriptionmercredi 11 mai 2005StatutMembreDernière intervention11 mai 2005 11 mai 2005 à 14:52
merci de ta réponse,
mais tu es sur de ce que tu dis ?
car comme je l'ai dit dans mon premier message, lorsque j'utilise mon code, la fonction recv recoit bien le nombre de caractère que je veux (car elle retourne le bon nombre de caractères de la page que je veux), mais après le buffer n'est pas correctement remplit, c pour ca, j'aurais plutot pensé qu'il y avait un problème au niveau de la taille de mon buffer (pas assez grand).
shocknurris
Messages postés4Date d'inscriptionmercredi 11 mai 2005StatutMembreDernière intervention11 mai 2005 11 mai 2005 à 16:22
oups je me suis trompé,
et pourtant avant d'avoir modifié mon code (car j'y ait fait des retouches longuement) je n'avais pas la meme valeur dans ret que dans strlen(buffer); c'est pour ca que je pensais que ca venait d'un problème de mémoire.
Et la je viens de vérifier et finalement, recv m'indique bien le nombre de caractère qui est affiché (strlen(buffer), sorry.
peux tu m'indiquer donc comment réappeller recv comme tu la suggèrer dans ton premier message ?
Merci encore aardman
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 11 mai 2005 à 16:32
Salut,
Si tu sais exactement combien d'octet tu dois recevoir, il te suffit de rappeler recv tant que tu n'a pas recu le bon nombre d'octet.
Voila une fonction qui en théorie fait ca (je le n'ai pas testée donc il est probable qu'elle ne fonctionne pas):
int _recv(SOCKET sock,
char *buff,
int len,
int flags)
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 11 mai 2005 à 17:32
Salut,
L'avantage de mon _recv c'est que - si il marche - il est reutilisable.
Et si on voulait vraiment recuperer la page proprement, il faudrait parser le header de la reponse http, extraire la taille du fichier, et boucler sur cette taille.
shocknurris
Messages postés4Date d'inscriptionmercredi 11 mai 2005StatutMembreDernière intervention11 mai 2005 11 mai 2005 à 19:40
ok merci pour vos codes, je regarderai tout ca un autre jour,
j'ai rapidement mis la fonction que tu as donné aardman et pour l'instant meme des la premiere execution de la boucle for ret renvoit -1 (socket_error), mais j'ai pas cherché a trouver le problème, ca doit venir du reste de mon prog