Probleme de Socket

Résolu
cs_Basica Messages postés 18 Date d'inscription samedi 11 mai 2002 Statut Membre Dernière intervention 28 octobre 2005 - 18 janv. 2005 à 23:25
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 - 19 janv. 2005 à 14:50
Bonjour, j'ai un petit problème avec winsock que je n'arrive pas à résoudre.



Mon but est de récuppérer des pages internet en utilisant winsock en C/C++ sous Dev-C++. Mon problème est le suivant:

Lorsque je récupère ce que m'envoie le serveur http avec la fonction
recv, le nombre d'octet récupéré ce limite toujours à 1460 octets.

Evidament cela m'empèche de récupérer l'intégralité des pages html.



Voici le code source que j'utilise:





#include <stdio.h>

#include <winsock2.h>

#include <windows.h>

#pragma comment(lib, "ws2_32.lib")



SOCKET s;

in_addr addr;

sockaddr_in sin;

hostent * host;

WSADATA wsa;

char buf[8192];

int octet = 0;



int main(void)

{

WSAStartup(0x0202, &wsa);



s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if(s == SOCKET_ERROR){

printf("socket : %d\n", WSAGetLastError());

}



host = gethostbyname("192.168.0.6");



memcpy(&addr, host->h_addr, host->h_length);

sin.sin_family = AF_INET;

sin.sin_port = htons(80); // HTTP

sin.sin_addr = addr;



if(SOCKET_ERROR == connect(s,(sockaddr*)&sin, sizeof(sin))){

printf("connect : %d\n", WSAGetLastError());

}



strcpy(buf, "GET / HTTP/1.0\n\n"); // la requete http

send(s, buf, strlen(buf), 0);



octet = recv(s, buf, sizeof(buf), 0);



for(int i=0; i<octet; i++)

printf("%c", buf[i]);



closesocket(s);

WSACleanup();



return 0;

}



Après quelque recherches, il semblerait que ce problème est du à la
limitation des trames ethernet à 1500 octet (simple supposition).



Si quelqu'un connait la solution de ce problème ou une manière de le contourner, j'aimerais vraiment qu'il m'en fasse part.

4 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
19 janv. 2005 à 01:13
Salut,
Il faut appeler recv() dans une boucle, tant que tu n'a pas recu le bon nombre d'octet (la taille du fichier est dans la réponse http du serveur).
3
cs_Basica Messages postés 18 Date d'inscription samedi 11 mai 2002 Statut Membre Dernière intervention 28 octobre 2005
19 janv. 2005 à 12:30
Voila ça marche! Merci beaucoup.



Voici la nouvelle portion de code (il y a peut-etre des bug encore):



send(s, buf, strlen(buf), 0);



octet = recv(s, buf, sizeof(buf), 0);

while (octet >= 1460)

{

octet = recv(s, buf, sizeof(buf), 0);

for(int i=0; i<octet; i++)

printf("%c", buf[i]);

}



closesocket(s);
0
cs_Basica Messages postés 18 Date d'inscription samedi 11 mai 2002 Statut Membre Dernière intervention 28 octobre 2005
19 janv. 2005 à 12:31
Voila ça marche! Merci beaucoup.



Voici la nouvelle portion de code (il y a peut-etre des bug encore):



send(s, buf, strlen(buf), 0);



octet = recv(s, buf, sizeof(buf), 0);

while (octet >= 1460)

{

octet = recv(s, buf, sizeof(buf), 0);

for(int i=0; i<octet; i++)

printf("%c", buf[i]);

}



closesocket(s);
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
19 janv. 2005 à 14:50
Salut,
En fait, si tu fais une requette simple comme ca, le serveur va envoyer sa reponse, suivie du fichier, puis immédiatement apres il ferme la connexion tcp.
Donc pour etre sur de pas louper un octet il faut faire une boucle qui appele recv (comme tu as fait) mais il faut sortir de la boucle quand recv retourne ou 0, ou -1 (SOCKET_ERROR).
0
Rejoignez-nous