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   -
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

0cTeT Messages postés 39 Date d'inscription   Statut Membre Dernière intervention   213
 
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.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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,
0
ElementW Messages postés 4814 Date d'inscription   Statut Contributeur Dernière intervention   1 223
 
T'es sur quel OS ?
"#include <winsock2.h>": cette ligne a elle seule indique l'OS...
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Yep. Mais entre Win95 et Win8, il y a un monde...
0
sambia39 Messages postés 610 Date d'inscription   Statut Membre Dernière intervention   49
 
Bonsoir
mais diable un seule script suffit
et une question , à la compilations pas trop de warning ??
0