begin process at 2012 02 12 07:44:44
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

Réseau & Internet

 > 

Probleme wsock protocole HTTP


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Probleme wsock protocole HTTP

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ée 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 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 analyseur lexical pascal [ par perrotta ] Bonjour, dsl pour ma langue je parle pas bien le français; je suis entrin de devlopper un analyseur lexical pour un programme (pascal) prèci ,et j'ai


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,499 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales