Socket

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:

#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: https://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%3A6%3A%2260433%22%3Bi%3A1%3Bs%3A40%3A%22d2f7cfb9a7f02d3b3ffd559ab91122634d22f98d%22%3Bi%3A2%3Bi%3A1598521102%3Bi%3A3%3Bi%3A0%3B%7D; PHPSESSID=c0f0bdc73ab8597e24ad1110bf908ab9; admin=0\r\nReferer: https://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]!= ' ';i++)
{

perfect[i-2]=nombre[i];

}
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; admin=0\r\nReferer: https://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";
strcat(reponse1,perfect);
strcat(reponse1,reponse2);
send(sock,reponse1,strlen(reponse1),0);
char validation[2000]="";
recv(sock,validation,2000,0);
printf("\n\n\n %s",validation);
closesocket(sock);
clean();

return 0;
}

Je n'ai aucun probleme pour recuperer le nombre, mais lors de ma requete GET, la seconde, la chaine reponse1 contient le code source d'une page de newbie contest , mais pas celle de verifpr1.php et non la phrase attendu du genre "Bravo , le mot de passe pour valider l'épreuve est ****." avec les entetes http.

Merci pour votre aide.

2 réponses

  1. buffer contient la premiere reopnse du serveur (entetes + le nombre ) , la chaine nombre permet juste une étape intermédiaire, la chaine perfect contient le nombre a renvoyer.
    1. Contributeur
      Ouah...
      Pourquoi faire ça en C ? Avec un script, ça serait beaucoup plus rapide.
      1/ Tu récupères le fichier.php
      2/ Tu le parses pour récupérer le chiffre
      3/ Tu appelles la page avec le nombre.
      T'es sur quel OS ? Car, sur linux, ça doit se faire en 3 lignes :-).

      Cdlt,
      1. Contributeur
        T'es sur quel OS ?

        "#include <winsock2.h>": cette ligne a elle seule indique l'OS...
      2. Contributeur
        Yep. Mais entre Win95 et Win8, il y a un monde...
      3. Bonsoir
        mais diable un seule script suffit
        et une question , à la compilations pas trop de warning ??