Socket
0cTeT
Messages postés
39
Date d'inscription
Statut
Membre
Dernière intervention
-
sambia39 Messages postés 610 Date d'inscription Statut Membre Dernière intervention -
sambia39 Messages postés 610 Date d'inscription Statut Membre Dernière intervention -
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:
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.
#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
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.