begin process at 2012 02 11 02:04:57
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Probleme de Socket


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

Probleme de Socket

mardi 18 janvier 2005 à 23:25:15 | Probleme de Socket

Basica

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.
mercredi 19 janvier 2005 à 01:13:21 | Re : Probleme de Socket

aardman

Membre Club
Réponse acceptée !

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).

mercredi 19 janvier 2005 à 12:30:42 | Re : Probleme de Socket

Basica

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);
mercredi 19 janvier 2005 à 12:31:28 | Re : Probleme de Socket

Basica

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);
mercredi 19 janvier 2005 à 14:50:26 | Re : Probleme de Socket

aardman

Membre Club

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).



Cette discussion est classée dans : problème, socket, sin, buf, addr


Répondre à ce message

Sujets en rapport avec ce message

Client html [ par elinep ] Voila le code d'un petit client html que j'ai trouve sur cppfrance:#include #include #include #pragma comment(lib, "ws2_32.lib")SOCKET s;in_addr addr; Problème serveur http, requêtes successives [ par lkm ] Bonsoir à tous,je suis en train de réaliser un petit client http qui à pour but de me loguer sur un site puis de parcourir quelques pages de ce même s CreateProces et fork [ par laetitiavincent ] Bonjour tout le mondeAlors je sais que fork n'existe pas sous windows. On peut utiliser CreateProcess mais mon souci et que je mélange ca avec un sock TimeOut sur un socket [ par djosh ] Voici un bout de code des sources du logiciel VNC, la fonction connect(). Mon but est de réduire le temps de réponse (message:"failed to connect to se Documentation Reseaux [ par SnowBlade360 ] Bonjour J'ai trouver sur inernet du code afin de crée une socket mais j'aimerais connaitre exactement tout les champs qui la compose voici mon code : mail - socket - pk sa déconne ?!? [ par Gendal67 ] Bonsoir,Alors la, jvous en prie aidez moi avant que je ne prenne mon clavier, ma souris, mon modem et tout le reste et que je les cognent du +fort que Multiples messages non reçus...:(( [ par Gendal67 ] Bonsoir tout le monde!Je suis actuellement en cours d'apprentissage des Sockets et j'ai crée une application Client/Server pouvant communiquer ensembl programmation socket [ par samijaba ] je suis entraint de dévélopper une application réseaux (client/serveur)mon probléme est que lorsque j'essai de connecter hors de réseau local il n'y a Socket sur WAN [ par galmone ] Bonjour,Voila mon probleme, j'ai une application client et une server, les 2 communiquent a merveille sur la loopback adresse (127.0.0.1-255), en LAN Probleme Winsock [ par fredsor ] Salut a vous, Je suis toujours en train de passer une appli de embedded visual c++ (donc pour Windows CE => Pocket Pc) vers DevC++ (windows "normal",


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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,374 sec (3)

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