Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Probleme wsock protocole HTTP [ Windows / Réseau & Internet ] (Target67)

samedi 28 juin 2008 à 23:11:14 | Probleme wsock protocole HTTP

Target67

Alors je veux faire une petite appli qui permet de télécharger des fichiers sur le net suivant le protocole HTTP dont voici le code de la partie qui va chercher le fichier:

void getfile(SOCKET sock,SOCKADDR_IN sin,char* file){

FILE * infile;
infile = fopen(file,"wb");
char* mes = new char[255];
char* buffer = new char[1024];
int byteget;
bool header = false;
char* buf2;

connect(sock,(SOCKADDR *)&sin,sizeof(sin));

sprintf(mes,"GET /home/patcher/%s HTTP/1.0\r\nConnection: close\r\n\r\n",file);

send(sock,mes,strlen(mes),0);

while((byteget = recv(sock,buffer,1024,0)) > 0 ){
              
               if( !header ){
               buf2 = strstr(buffer,"\r\n\r\n") + 4;
               fwrite(buf2,byteget - (buf2-buffer),1,infile);
               header = true;
               }else{
                     fwrite(buffer,byteget,1,infile);
               }
}

shutdown(sock,2);
fclose(infile);

}

Je l'utilise dans une boucle dans laquelle je rentre un nom de fichier a télécharger, ça marche parfaitement la première fois (fichier complet sans soucis) mais si je lance un 2e téléchargement ensuite, celui-ci me donne un fichier vide... Merci de bien vouloir m'aider ^^

dimanche 29 juin 2008 à 10:22:31 | Re : Probleme wsock protocole HTTP

jfrancois

Bonjour,

Peut-être parce qu'il manque les delete qui doivent aller avec les new ?

Jean-François


dimanche 29 juin 2008 à 12:02:21 | Re : Probleme wsock protocole HTTP

Target67

Merci de ta réponse.

Non j'ai essayé a tout hasard, mais j'avais déjà commencé d'autres versions où  l'allocation de mémoire était faite avant itération (donc aucune necessité de delete entre chaque itération).

Je tiens aussi a préciser qu'en faisant des tests similaires avec le protocole FTP (en exécutant les instructions correctement) j'arrivais aussi a downloader un premier fichier mais pas un deuxième...

Ma question serait de savoir si une fois le socket fermé, il faut le réinitialiser d'une manière quelconques ou quoi? ...


dimanche 29 juin 2008 à 17:14:03 | Re : Probleme wsock protocole HTTP

aardman

Membre Club
Salut,
Commence surtout par traiter les erreurs des fonctions winsock et d'afficher des messages en conséquence: ta fonction n'affiche rien, ne log rien, ne retourne rien: a moins d'etre devin c'est impossible a debuger. A mon avis, c'est le deuxieme connect() qui échoue, je pense pas qu'on puisse réutiliser un socket de cette maniere (même apres un shutdown).
Ensuite, y'a d'autres problemes, comme la fuite de mémoire signalée par jfrancois, mais plus grave a mon avis, c'est le "strstr(buffer,"\r\n\r\n")": le serveur n'envoie pas de chaine terminée par 0, donc on peut pas utiliser strstr. Autre problême mineur, que se passe-t-il lorsqu'on ne recoit qu'une partie de la réponse lors du premier recv() ?


dimanche 29 juin 2008 à 19:18:07 | Re : Probleme wsock protocole HTTP

Target67

Merci pour ta réponse, il faudrait en effet que je soit un peu plus rigoureux lorsque je code et des récups d'erreurs ne font jamais de mal...

En ce qui concerne la fuite de mémoire, je l'ai réglé suite au message de jfrancois, en ce qui concerne le strstr il marche très bien (je comprend pas ce que tu veux dire par la), je l'utilise pour virer le header de la réponse du serveur HTTP au niveau des recv il gère tres bien les réponse au dela de la taille du buffer (j'ai envoyé au travers un fichier de 1Mo dont j'ai verifié le checksum), la boucle sert à ça...

Sinon lorsque je mes un récup d'erreur à la deuxieme tentative il me sort un code d'erreur 10056 >> Socket is already connected.

Que faudrait-il que je fasse? passer par des pointeurs et effacer les socket a la fermeture?

dimanche 29 juin 2008 à 22:45:03 | Re : Probleme wsock protocole HTTP

aardman

Membre Club
Réponse acceptée !
Salut,
j'ai bien compris a quoi servait le strstr(), mais comme son nom l'indique c'est une fonction qui s'applique sur des chaines de caracteres uniquement, pas sur des données brutes que tu recois avec recv().
Pour le socket, il faut en recreer un nouveau pour chaque connexion (socket(), closesocket()).


lundi 30 juin 2008 à 21:22:07 | Re : Probleme wsock protocole HTTP

Target67

Merci beaucoup, ça marche maintenant...

Pour ce qui est  de la question du strstr, il est necessaire que ce soit une chaine uniquement car c'est le caractère \0 qui arrête la recherche non? dans mon cas j'ai choisi plutôt que de bidouiller avec des memcmp et memchr de rajouter un caractère \0 a la fin de la chaine et de faire coller le recv de façon à ce qu'il n'écrive pas par dessus ce dernier caractère, ce qui donne avec toutes les modifs:

void getfile(SOCKADDR_IN sin,char* file){
char* mes = new char[255];
char* buffer = new char[1025];
buffer[1024] = '\0';
int byteget;
bool header = false;
char* buf2;

SOCKET sock;

sock = socket(AF_INET,SOCK_STREAM,0);

if(connect(sock,(SOCKADDR *)&sin,sizeof(sin))==SOCKET_ERROR){
         Affsockerror();
}else{         
FILE * infile;
infile = fopen(file,"wb");

sprintf(mes,"GET /home/patcher/%s HTTP/1.0\r\nConnection: close\r\n\r\n",file);

send(sock,mes,strlen(mes),0);

while((byteget = recv(sock,buffer,1024,0)) > 0 ){
               
               if( !header ){
               buf2 = strstr(buffer,"\r\n\r\n") + 4;
               fwrite(buf2,byteget - (buf2-buffer),1,infile);
               header = true;
               }else{
                     fwrite(buffer,byteget,1,infile);
               }
}
closesocket(sock);
fclose(infile);
}
delete(mes);
delete(buffer);
}

Merci encore pour votre aide a tous les deux ^^



Cette discussion est classé dans : buffer, http, char, sock, infile


Répondre à ce message

Sujets en rapport avec ce message

SVP besoin d'aide [ par seito ] [size=5] seito [/size]j'ai déveloper une apploication pour transferer des fichiersla reception est parfaite pourtant à l'envoie ça me cause des tas de Probléme pour lire le buffer au lancement de la connexion [ par logant83 ] Bonsoir, voila enfaite j'ai établi une connexion sur un server irc grace au socket mais quand je recois sur le buffer les différente informations (Ell buggage [ par logant83 ] Bonjour, voila enfaite je suis sous devc++ et je code un service irc et je sais pas ce qui se passe, de temp en temp window m'envoy une erreur comme k Recuperer contenu requete http [ par fredsor ] Bonjour, Je voudrais me connecter a mon serveur local afin de recuperer le contenu par exemple d'un fichier txt.Grace a un code trouvé sur le site, j' Requete HTTP POST MIME - Upload de fichier [ par SuperChouquette ] Bonjour, je suis débutant et j'ai créer une fonction pour uploader un fichier sur un serveur php apache via le protocole http et le standard mime.Le p Erreur fermeture ifstream [ par xeon666 ] Voila mon probleme : Je lit un fichier séquentiellement et quand j'arrive a la fin ou que j'ai trouve ce que je désire, je sort de ma boucle ferme et Socket Requette HTTP Post - Enlever le header de la réponse [ par SuperChouquette ] Bonjour, je suis débutant et à l'aide d'autres sources j'ai créer une fonction pour envoyer une requete POST à un serveur web, celle-ci fonctionne bie Client / Serveur => Je m'enmèle les pinceaux avec le buffer, les boucles etc. [C] [ par matad0r ] Bonjour, bonjour!J'ai récemment créé une petite application client/serveur de rien du tout (je suis débutant), en m'aidant de ça : http://c.developpez char* dans un destructeur [ par pepsidrinker ] Premierement, merci de lire ce post, et merci a tous ceux qui veulent maider. Jai le probleme suivant: Jassigne des char* avec 'new[]' dans le constru verification de code [ par dyroj ] salut a tous,je voudrai savoir si il y a des faute au niveu de la fonction select() et si je suis obliger de metre sock+1 au lieu de sock dans se peti


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,374 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.