Page 1 sur 1

Probleme socket requete GET

Posté : lun. 17 nov. 2014 12:25
par 0cTeT
Bonjour, Je travaille sur un petit projet aves les sockets windows pour valider une épreuve du site newbiecontest.org (la premiere epreuve, renvoi). Le but est de récupérer un nombre sur la page prog1.php et de renvoyer ce nombre a la page verifpr1.php sous la forme verifpr1.php?solution=nombre. Voici mon code:

code#include stdio.h
#include stdlib.h
#include winsock2.h
#include string.h
#define PORT  80

void init()
{
   WSADATA wsa;
   int error = WSAStartup(MAKEWORD(2,0),wsa);
   if (error 0)
   {
       puts("WSAStartup failed !");
       exit(EXIT_FAILURE);
   }
}
void clean()
{
   WSACleanup();
}

int main()
{
   int i;
   init();
   SOCKET sock = socket(AF_INET, SOCK_STREAM,0);
   char buffer[9999]= "", *nombre = NULL, perfect[]="";
   struct sockaddr_in sin = {0};
   struct hostent *hostinfo = NULL;

   if(sock == INVALID_SOCKET)
   {
       perror("socket()");
       exit(errno);
   }

  hostinfo = gethostbyname("www.newbiecontest.org");
  sin.sin_addr = *(IN_ADDR*) hostinfo-h_addr;
  sin.sin_port = htons(PORT);
  sin.sin_family = AF_INET;

  if(connect(sock,(SOCKADDR *)sin, sizeof(SOCKADDR))== SOCKET_ERROR)
  {
      perror("connect()");
      exit(errno);
  }
   printf("connected ! On envoie la requete...");
   if((send(sock, "GET /epreuves/prog/prog1.php HTTP/1.1\r\nHost: www.newbiecontest.org\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nAccept-Encoding: gzip,deflate,sdch\r\nAccept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4\r\nCookie: SMFCookie89=a%3A4%3A%7Bi%3A0%3Bs%3A5%3A%2260433%22%3Bi%3A1%3Bs%3A40%3A%22d2f7cfb9a7f02d3b3ffd559ab91122634d22f98d%22%3Bi%3A2%3Bi%3A1598521102%3Bi%3A3%3Bi%3A0%3B%7D; PHPSESSID=c0f0bcc73ab8597e24ad1110bf908ab9; admin=0\r\nReferer: http://www.newbiecontest.org\r\nUser-Agent:  Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.102 Safari/537.36\r\n\r\n",sizeof("GET /epreuves/prog/prog1.php HTTP/1.1\r\nHost: www.newbiecontest.org\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nAccept-Encoding: gzip,deflate,sdch\r\nAccept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4\r\nCookie: SMFCookie89=a%3A4%3A%7Bi%3A0%3Bs%3A5%3A%2260433%22%3Bi%3A1%3Bs%3A40%3A%22d2f7cfb9a7f02d3b3ffd559ab91122634d22f98d%22%3Bi%3A2%3Bi%3A1598521102%3Bi%3A3%3Bi%3A0%3B%7D; PHPSESSID=c0f0bcc73ab8597e24ad1110bf908ab9; admin=0\r\nReferer: http://www.newbiecontest.org\r\nUser-Agent:  Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.102 Safari/537.36\r\n\r\n"),0 )) == -1)
   {
       printf("\npas de send...");
   }
   recv(sock,buffer,9999,0);
   printf("\n\n %s",buffer);
   nombre = strrchr(buffer, ':');
   printf("\n\nnombre : %s",nombre);
   for(i=2;nombre!= ' ';i++)
   {

   perfect[i-2]=nombre;

   }
   printf("\n\n\n perfect :%s",perfect);
   char reponse1[]="GET /epreuves/prog/verifpr1.php?solution=";
   char reponse2[]=" HTTP/1.1\r\nHost: www.newbiecontest.org\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nAccept-Encoding: gzip,deflate,sdch\r\nAccept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4\r\nCookie: SMFCookie89=a%3A4%3A%7Bi%3A0%3Bs%3A5%3A%2260433%22%3Bi%3A1%3Bs%3A40%3A%22d2f7cfb9a7f02d3b3ffd559ab91122634d22f98d%22%3Bi%3A2%3Bi%3A1598521102%3Bi%3A3%3Bi%3A0%3B%7D; PHPSESSID=c0f0bcc73ab8597e24ad1110bf908ab9\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.102 Safari/537.36\r\nX-DevTools-Emulate-Network-Conditions-Client-Id: 19978059-39A4-4C97-AE6E-EF9D4C00626A\r\n\r\n";
   strcat(reponse1,perfect);
   strcat(reponse1,reponse2);
   if((send(sock,reponse1,strlen(reponse1),0)) !=-1)
   {
       printf("\n\ndeuxieme requete envoyee...");
   }
   char validation[2000]="";
   recv(sock,validation,2000,0);
   printf("\n\n\n %s",validation);
   printf("\n\n\n %s",reponse1);
   closesocket(sock);
  clean();


   return 0;
}
/code

Pour les entetes http, celles que j'envoie j'ai choisit d'utiliser les memes que celles que chrome envoie. Lors de ma premiere requete GET, le serveur me repond, et je peux lire dans buffer la reponse : HTTP/1.1 200 OK ... (entetes) puis la phrase "Le nombre aléatoire pour valider ta reponse est: **** . Donc pour l'instant tout va bien. Je traite buffer et stocke le nombre dans perfect.
Or lors de ma deuxieme requete GET (GET /epreuves/prog/verifpr1.php?solution=valeurdeperfect...), validation , la chaine qui recoit la reponse du serveur contient :

"?xml version="1.0" ...
!DOCTYPE html PUBLIC ....
head
title ....
Bref le code source d'une page de newbiecontest, mais en aucun comme au premier GET.
Il n'y a pas HTTP/1.1 200 OK, il n'y a pas d'entetes, juste le code de la page (je ne sais meme pas laquelle c'est).

Merci de m'aider !