Socket

Fermé
0cTeT Messages postés 39 Date d'inscription samedi 15 juin 2013 Statut Membre Dernière intervention 30 mars 2020 - Modifié par 0cTeT le 31/08/2014 à 16:26
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 31 août 2014 à 22:42
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 samedi 15 juin 2013 Statut Membre Dernière intervention 30 mars 2020 211
31 août 2014 à 15:30
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
31 août 2014 à 19:55
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 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
31 août 2014 à 20:18
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
31 août 2014 à 21:19
Yep. Mais entre Win95 et Win8, il y a un monde...
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
31 août 2014 à 22:42
Bonsoir
mais diable un seule script suffit
et une question , à la compilations pas trop de warning ??
0