Probleme de Socket [Résolu]

Signaler
Messages postés
18
Date d'inscription
samedi 11 mai 2002
Statut
Membre
Dernière intervention
28 octobre 2005
-
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
-
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

Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
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).
Messages postés
18
Date d'inscription
samedi 11 mai 2002
Statut
Membre
Dernière intervention
28 octobre 2005

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);
Messages postés
18
Date d'inscription
samedi 11 mai 2002
Statut
Membre
Dernière intervention
28 octobre 2005

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);
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
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).