Accueil > Forum > > > > Recuperer contenu requete http
Recuperer contenu requete http
jeudi 28 juin 2007 à 14:38:48 |
Recuperer contenu requete http

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'arrive bien a créer ma socket avec Winsock, et a l'aide du GET, je rcupere bien des données. Cependant je ne récupère que l'entete de ma requete, or je voudrais moi ce qui se trouve en dessous, c'est a dire le contenu... Voici la fonction que j'utilise : void main(void) { WSADATA WSAData; WSAStartup(MAKEWORD(2,0), &WSAData); SOCKET sock; SOCKADDR_IN sin;
char buffer[1024]; char canal[50] = "GET /ecran.txt HTTP/1.0\nAccept: */*\n\n";
sock = socket(AF_INET, SOCK_STREAM, 0); sin.sin_addr.s_addr = inet_addr("1.1.xx.xx"); // serveur local sin.sin_family = AF_INET; sin.sin_port = htons(80); // port HTTP.
connect(sock, (SOCKADDR *)&sin, sizeof(sin)); // on se connecte send(sock, canal, strlen(canal), 0); // on envoie la requête HTTP. int i = recv(sock, buffer, sizeof(buffer), 0); // le buffer récupère les données reçues. if (i != 0) { EcrireFichierBidon(buffer); // j'ecris ce que je recupere dans un fichier } closesocket(sock); // on ferme le socket. WSACleanup(); }
Voila, et je recupere ceci : HTTP/1.1 200 OK Content-Type: text/plain Content-Length: 545 etc etc...
Si je regarde les flux transmit entre mon simulateur et le serveur, le stream de "/ecran.txt" me renvoi les memes données, suivi en dessous du contenu de mon fichier...
Merci!
|
|
jeudi 28 juin 2007 à 15:15:01 |
Re : Recuperer contenu requete http

aardman
|
Salut,
qu'est ce qui te dit que tu va recevoir toute la réponse et tout le fichier en un seul recv() ?
il faut faire des recv() en boucle jusqu'a avoir recu toute la reponse
plus la longueur des données specifiée dans le champ content-length de
la réponse.
|
|
jeudi 28 juin 2007 à 15:29:04 |
Re : Recuperer contenu requete http

fredsor
|
Je pensais (donc à tort ) que ca recupererai tant que le buffer ne serait pas plein... Excuse moi aardman peux-tu développer un peu quand tu dis "plus la longueur des données specifiée dans le champ content-length de la réponse." Je n'ai pas trop compris. Moi concretement comme tu l'a vu, mon content length est de 545... C'est donc la longueur de tout le header present au dessus du contenu de mon fichier texte qui es de 545? Donc pourais commencer a recuperer a partir "d'apres" ce header? Et la boucle je dois l'arreter en fonction de quoi? En tout cas merci pour ta réponse rapide, je me repenche dessus 
|
|
jeudi 28 juin 2007 à 15:36:08 |
Re : Recuperer contenu requete http

aardman
|
Réponse acceptée !
Salut, Le content-length c'est la longueur des données qui suit la
réponse http du serveur, c'est donc la longueur du fichier qu'il te
renvois (545 octets dans ton cas).
Pour faire un truc propre, il faudrait:
1) faire des recv() en boucle jusqu'a avoir recu toute la réponse http,
2) extraire la valeur du champ Content-Length de la réponse http,
3) continuer a faire des recv() en boucle jusqu'a avoir recu tout le fichier.
|
|
jeudi 28 juin 2007 à 15:44:41 |
Re : Recuperer contenu requete http

fredsor
|
Salut, Ok pour tout récupérer, cependant je ne vois pas comment faire ma boucle de recv. Quels sont les parametres en plus que j'ai omis, pour dire par exemple que le deuxieme recv doit commencer où le 1er s'est arrété. En gros j'ai testé en faisant deux recv consécutifs, et ils me renvoient deux fois l'entete de la requete...
|
|
jeudi 28 juin 2007 à 17:53:24 |
Re : Recuperer contenu requete http

fredsor
|
J'ai reussi a faire ma boucle, voici un aperçu : Avec un fichier contenant le texte "coucou123" ........ char buffer[10][1024]; int i=0; int j=0; while(i = recv(sock, buffer[j], sizeof(buffer[j]), 0)) { if(i==9) // taille du content length ( je ferais la recuperation plus tard ) { EcrireFichierBidon(buffer[j]); } j++; } closesocket(sock); // on ferme le socket. ......... Je recuperer bien mon texte seulement. Mais comme tu vois, ca me parait etre une methode asez bourrine... Donc j'aimerais savoir ce que tu en pense. SI tu crois que ca peut passer et que de toute maniere je ne pourrais pas faire autrement, n'hésite pas  Donc a priori il me reste a recuprer le content length, et de rechercher lorsque "i" est égal a cette quantité...?
|
|
jeudi 28 juin 2007 à 18:31:57 |
Re : Recuperer contenu requete http

aardman
|
Réponse acceptée !
Salut,
Mouais, je suis pas sur qu'un tableau a deux dimensions soit utile.
Deja une boucle simple, par exemple, pour remplir un buffer avec des recv en boucle ca aurait cette tête (à tester):
char buffer[1024];
int size = 0, r = 0;
while((r = recv(..., buffer + size, sizeof(buffer) - size, ...)) > 0)
{
size += r;
// ici tu traites les 'size' octets qui sont dans 'buffer'
}
Dans ta boucle tu verifie si tu as recu la requette http, et si oui tu
la parse et tu extrait Content-Length et tu sors de ta boucle.
Et la tu peux entrer dans une deuxieme boucle ou tu ecris tout ce que tu recois dans ton fichier (par exemple).
|
|
vendredi 29 juin 2007 à 09:32:37 |
Re : Recuperer contenu requete http

fredsor
|
Impec aardman, je devrais m'en sortir avec ca (ca foncitonne, me reste que le travaille de parsing)  Je profite de ta bonté ^^, j'ai une derniere petite question... Apres récupération du fichier et traitement associé, je dois etre capable de renvoyer une chaine de caractère à travers une autre url. Dois-je faire un 'send' de la meme maniere? Je suppose que pour créer une nouvelle requete valide, je devrais insérer un en-tete semblable à celui récupéré précédemment? Donc devrais-je créer un send pour l'entete, puis un autre avec ma chaine de caractere? Ou y-a-t-il de nouvelles notions que je devrais m'empresser de voir? Je te remercie pour ton attention!! 
|
|
vendredi 29 juin 2007 à 18:25:43 |
Re : Recuperer contenu requete http

aardman
|
Salut,
Si tu veux envoyer une chaine au serveur http, c'est plutot une requette POST qu'il faudrait faire.
Mais sinon ca reste le même systeme, une requette suivie des données,
la longueur des données est toujours dans Content-Length. Le mieux
serait de regarder dans la rfc http pour etre sûr.
|
|
samedi 30 juin 2007 à 11:54:43 |
Re : Recuperer contenu requete http

fredsor
|
Merci aardman, je vais regardé du coté de la rfc Par contre sais tu coment fonctionnent les requetes POST avec winsock? Aurait tu un exemple? Car sinon jai bien envoyer une chaine "hello world" avec send, et avec Wireshark je situe bien un paquet contenant cette chaine, mais apres je sais pâs si cette reqeute est valable... Donc voila, sit u sais comment géré les requete POSt, je suis tout ouïe  Merci!
|
|
Cette discussion est classée dans : buffer, http, contenu, sin, sock
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
client serveur [ par elanspeech ]
Bonjour,Je suis en train de programmer un petit client serveur en C pour windows avec dev-c++. J'obtiens l'erreur suivante a la compilation : D:\DEV-C
thread ne répondant pas sous MFC [ par seito ]
bonjours,je suis en train de concevoir une application qui me permet d'éffectuer un chat en réseau sous "Visual C++ 6.0" le problême c'est que quand j
Problème de Socket(recv) [ par YnOThAr ]
Voila je suis en train d'essayer de faire un client FTp mais j'ai vraiment du mal...mon preblème c ke j'arrive pas à réceptionner les réponses du serv
Socket Server/Client [ par XKaliBur ]
Je suis débutant et je voudrais faire en sorte d'envoyer un message au mon serveur et des que ce dernier reçoit un message, il réponde en fonction de
link avec GCC [ par mrjulien ]
Bonjours a tous.Je compile avec gcc sous windows (grâce a mingw). Je ne souhaite pas vous ennuyer en créant un topic redondant, mais je n'arrive pas à
Socket en C [ par RM50Man ]
WSADATA ws; WSAStartup(MAKEWORD(2,0), &ws); &n
[C] Probleme Socket [ par firemax ]
Voila le code : En gros je sais pas qu'elle est le probleme et je n'est aucun message d'erreur :D [code]#include "lib.h" int main() { int sock
Problème dialogue socket [ par Crazy_Joe ]
Bonjour à tous, voilà j'ai un problème avec les sockets. Je voudrais me connecter au serveur pop de free sur le port 110 et récupérer le nombre d'ema
[socket et api win]recevoir et envoyer en meme temps [ par shadow1779 ]
Bonjour je me suis fais un petit programme irc qui me servira de bot pour auto-op des personne ou d'autre taches diverses, le client aura une boite de
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|