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 site. Avant de faire tout ça j'ai fait quelques tests:
Jusqu'ici j'ai réussi à envoyer des variables grace à la méthode POST.
Je récupère également le code html grace à la méthode GET
Cependant lorsque je réuni les 2, à savoir un envoi POST puis un envoi de GET, il semble que le serveur http ne reçoit pas la deuxième requete.
Comme il est indiqué dans le topic :http://www.cppfrance.com/forum.v2.aspx?id=429469, j'ai essayé de mettre un sleep entre les 2 envois : pas de résultats.
voici mon code, je me suis inspiré du topic :http://www.cppfrance.com/forum.v2.aspx?id=145537
çela marche en local sur un serveur php Appache, je n'ai pas mis le code de la page php qui reçoit le code car c'est vraiment trivial
#include <stdlib.h>
#include <time.h>
#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[1024];
char buf2[1024];
int octet = 0;
void sleep(int nbr_seconds)
{ clock_t goal;
goal = (nbr_seconds * CLOCKS_PER_SEC) + clock();
while(goal > clock()) {
; }}
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("localhost");
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, "POST /test.php HTTP/1.0\r\n Host: 127.0.0.1\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length:11\r\n\r\n var=canaris\r\n\r\n");
send(s, buf, strlen(buf), 0);
octet = recv(s, buf, sizeof(buf), 0);
for(int m=0; m<octet; m++)
printf("%c", buf[m]);
sleep(5);
strcpy(buf2, "GET /test.php HTTP/1.0\n\n"); // la requete http
send(s, buf2, strlen(buf2), 0);
octet = recv(s, buf, sizeof(buf), 0);
for(int i=0; i<octet; i++)
{printf("%c", buf[i]);}
closesocket(s);
WSACleanup();
return 0;
}
lkm