Salut, la requête HTTP est bonne, en tout cas conforme à la RFC 2616.
En revanche un seul recv() ne suffira pas.
Puis dès que le buffer de réception est plein il FAUT le terminer par zero pour pouvoir faire un faire un printf sinon erreur de segmentation.
Il faut débugger, voir ce qu'il nous dit. La fonction recv retourne un int, c'est le nombre d'octets reçus. Très utile pour voir si on a reçu quelque chose, ou pas.
Déjà essaye de te connecter avec ça:
[code]SOCKET Connection_TCP_INET(char *serveur, short port)
{
SOCKET sock=-1;
struct sockaddr_in ServAddr;
struct hostent *he;
// initialise ws2_32.dll sur windoze
WSADATA wsa;
if (WSAStartup(0x0202, &wsa) != 0)
{
printf("erreur WSAStartup()");
return -1;
}
//printf("gethostbyname(%s)\n", serveur);
if ((he = gethostbyname(serveur)) == NULL)
{
printf("err Gethostbyname()"); return -2;
}
//printf("Socket\n");
if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
{
printf("err socket()\n"); return -3;
}
//printf("fill address\n");
ServAddr.sin_family = AF_INET;
ServAddr.sin_port = htons(port);
ServAddr.sin_addr = *((struct in_addr *)he->h_addr);
//printf("connect()\n");
if (connect(sock, (struct sockaddr *)&ServAddr, sizeof(ServAddr))==-1)
{
printf("err connect()");
closesocket(sock);
return -4;
}
//printf("Connected\n");
return sock;
}
[/code]
Cette fonction crée un socket, le connecte, et retourne un pointeur vers le descripteur de fichier correspondant. Je m'en sers souvent pour les protocoles POP/SMTP/HTTP (port 80)/serveurs de chat etc
Donc appel de cette fonction dans le main:
Code C/C++ :
SOCKET sk = Connection_TCP_INET(char *serveur, short port);
if (!sk) return 1;
//et hop là tu es connecté
// envoie la requete HTTP ...
int i;
if ((i = send(sk, req, strlen(req), 0)) == -1) { printf ("erreur send()"); return -1; }
// ... et reçoit la sauce
char buf[512];
int total = 0;
while (i = recv(sk, buf, sizeof(buf), 0))
{
buf[i]=0;
printf("%s\n", buf);
total += i;
}
if (close(sk)==-1) { printf ("erreur close()"); return -1; }
printf("Socket fermé (%d octets recus).\n", total);
Pour ne pas spammer la console écris tout direct dans un fichier:
[code] FILE *fp = fopen("recv.txt", "wb");
while (i = recv(sk, buf, sizeof(buf), 0) )
{
buf[i]=0;
//printf("%s\n", buf);
fwrite (buf, 1, i, fp);
}
fclose(fp);[/code]
Voilà ici ça marche du tonnerre. Je suis sous linux, il y a juste une différence close() au lieu de closesocket(). Mais la fonction de connection elle est pour windows (WSAloperies).
Voilà bonne chance pour la suite. Il y a de fortes chances que le serveur envoie des données compressées (Transfer-Encoding: chunked). Ca c'est le header HTTP qui te le dira!