begin process at 2012 05 30 15:22:49
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Réseau & Internet

 > 

C requête http ne fonctionnant pas


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

C requête http ne fonctionnant pas

samedi 10 décembre 2011 à 14:05:44 | C requête http ne fonctionnant pas

sleepersh

Bonjour,
Depuis hier soir j'essaie tant bien que mal de récupérer le code html d'une page qui n'a pas d'extension: "www.habbo.fr/groups/jeux_sponso". J'ai alors essayé de récupérer le code html d'une page qui a justement une extension "www.dardanboy.franceserv.fr/index.php" et ça a fonctionné.
Le problème c'est que je ne sais pas s'il faut que je modifie ma requête.
Ma question: comment est-ce que je peux faire pour récupérer le code html de www.habbo.fr/groups/jeux_sponso
Mon code:
Code C/C++ :
WSADATA WSAData;
    int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);

    SOCKET sock;
    SOCKADDR_IN sin;

    char requete[] =    "GET /groups/jeux_sponso HTTP/1.1\r\n"
                        "Host: www.habbo.fr\r\n"
                        "\r\n";

    sock = socket(AF_INET, SOCK_STREAM, 0);

    /* Configuration de la connexion */
    sin.sin_addr.s_addr = inet_addr("62.50.35.202");
    sin.sin_family = AF_INET;
    sin.sin_port = htons(80);

    if(!erreur)
    {
        /* connexion grâce à connect */
        connect(sock, (SOCKADDR*)&sin, sizeof(sin));
        printf("Connexion à %s sur le port %d\n", inet_ntoa(sin.sin_addr), htons(sin.sin_port));
        /* send permet d'envoyer une requête à l'adresse scok. Dans ce cas, au site www.habbo.fr
        la requête est de type http:
        "GET /groups/jeux_sponso HTTP/1.0\r\n"
        "Host: www.habbo.fr\r\n"
        "\r\n"; */
        send(sock, requete, sizeof(requete), 0);
        /* On récupère la réponse du serveur et on la met dans buffer*/
        recv(sock, buffer, tailleBuffer, 0);
        printf("\nbuffer = %s", buffer);
        /* On ferme la connexion */
        closesocket(sock);
        WSACleanup();
        return 1;
    }
        closesocket(sock);
        WSACleanup();
        return 0;


Merci d'avance ;)
samedi 10 décembre 2011 à 14:38:29 | Re : C requête http ne fonctionnant pas

pop70

Salut, essaie en remplaçant:
Code C/C++ :
    sock = socket(AF_INET, SOCK_STREAM, 0);

par:
Code C/C++ :
 sock = socket(PF_INET, SOCK_STREAM, 0); // PF pour protocol family



C++dialement,

Pop70
samedi 10 décembre 2011 à 14:50:44 | Re : C requête http ne fonctionnant pas

sleepersh

Merci pour ta réponse et je viens de tester mais ce n'est pas ça le problème. Le problème se trouve dans le lien www.habbo.fr ou autre car j'ai essayé avec
char requete[] = "GET /index.php HTTP/1.1\r\n"
"Host: www.dardanboy.franceserv.fr\r\n"
"\r\n";

sock = socket(AF_INET, SOCK_STREAM, 0); // PF pour protocol family

/* Configuration de la connexion */
sin.sin_addr.s_addr = inet_addr("178.33.214.192");
et ça fonctionne parfaitement.
Par contre, dès que je mets l'ip 62.50.35.202, mon logi prend un temps fou et n'affiche rien au bout du compte.
dimanche 11 décembre 2011 à 19:21:08 | Re : C requête http ne fonctionnant pas

pop70

Ah oui, en effet, dans /usr/include/bits/socket.h il y a #define AF_INET PF_INET.
Sinon, pour le problème qui apparait en fonction de l'adresse c'est étrange, que donne un ping sur 62.50.35.202 ?

Et essaye de vérifier que la connexion fonctionne :

Code C/C++ :
if (connect(sock, (SOCKADDR*)&sin, sizeof(sin)) == -1)
   perror("Erreur connexion");


Pop70
mardi 13 décembre 2011 à 20:58:16 | Re : C requête http ne fonctionnant pas

sleepersh

J'ai testé la solution que tu m'as donnée mais toujours rien, connection ne renvoi pas d'erreur. Ce que j'ai oublié de mentionner c'est que après avoir fait une telle requête, l'accès au site m'est complètement impossible pendant quelques minutes, c'est-à-dire que c'est comme si le serveur ne répondait pas.
Je ne sais pas si cela est fait exprès, s'il faut envoyer une requête spéciale pour être "accepté" par le serveur et qu'il me retourne le code html et même après avoir sniffer, je ne trouve rien qui vaille.

Voici ce que je trouve quand je sniff la connexion de mon navigateur (Google Chrome) au site. Bizzarement, on voit 2 requêtes qui se ressemblent:
1ère requête:

Code :
GET /groups/jeux_sponso HTTP/1.1
Host: habbo.fr
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: __qca=P0-199355260-1323624564989; __utma=151556768.1622191701.1323624565.1323796545.1323800914.6; __utmz=151556768.1323624565.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
Accept-Encoding: gzip;q=1.0, deflate;q=0.8, chunked;q=0.6


et dans une deuxième requête (la suivante):



Code :
GET /groups/jeux_sponso HTTP/1.1
Host: www.habbo.fr
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: __qca=P0-199355260-1323624564989; __utma=151556768.1622191701.1323624565.1323796545.1323800914.6; __utmz=151556768.1323624565.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
Accept-Encoding: gzip;q=1.0, deflate;q=0.8, chunked;q=0.6

GET /myhabbo/styles/assets/other.css?v=e4d38323acb5a8182efc2f78d45f6fa4 HTTP/1.1
Host: www.habbo.fr
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2
Accept: text/css,*/*;q=0.1
Referer: http://www.habbo.fr/groups/jeux_sponso
Accept-Encoding: gzip,deflate,sdch
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: __qca=P0-199355260-1323624564989; __utma=151556768.1622191701.1323624565.1323796545.1323800914.6; __utmz=151556768.1323624565.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); SLID=132380598211935403.0
If-Modified-Since: Tue, 13 Dec 2011 18:43:40 GMT


Merci d'avance ;)
samedi 17 décembre 2011 à 03:11:12 | Re : C requête http ne fonctionnant pas

katsankat

Membre Club
Salut, la requête HTTP est bonne, en tout cas conforme à la RFC 2616.

En revanche un seul recv() ne suffira pas.

Puis dès que le buffer de réception est plein il FAUT le terminer par zero pour pouvoir faire un faire un printf sinon erreur de segmentation.

Il faut débugger, voir ce qu'il nous dit. La fonction recv retourne un int, c'est le nombre d'octets reçus. Très utile pour voir si on a reçu quelque chose, ou pas.


Déjà essaye de te connecter avec ça:
[code]SOCKET Connection_TCP_INET(char *serveur, short port)
{
SOCKET sock=-1;
struct sockaddr_in ServAddr;
struct hostent *he;

// initialise ws2_32.dll sur windoze
WSADATA wsa;
if (WSAStartup(0x0202, &wsa) != 0)
{
printf("erreur WSAStartup()");
return -1;
}

//printf("gethostbyname(%s)\n", serveur);
if ((he = gethostbyname(serveur)) == NULL)
{
printf("err Gethostbyname()"); return -2;
}

//printf("Socket\n");
if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
{
printf("err socket()\n"); return -3;
}

//printf("fill address\n");
ServAddr.sin_family = AF_INET;
ServAddr.sin_port = htons(port);
ServAddr.sin_addr = *((struct in_addr *)he->h_addr);

//printf("connect()\n");
if (connect(sock, (struct sockaddr *)&ServAddr, sizeof(ServAddr))==-1)
{
printf("err connect()");
closesocket(sock);
return -4;
}

//printf("Connected\n");
return sock;
}
[/code]


Cette fonction crée un socket, le connecte, et retourne un pointeur vers le descripteur de fichier correspondant. Je m'en sers souvent pour les protocoles POP/SMTP/HTTP (port 80)/serveurs de chat etc

Donc appel de cette fonction dans le main:

Code C/C++ :
SOCKET sk = Connection_TCP_INET(char *serveur, short port);
if (!sk) return 1;
//et hop là tu es connecté

// envoie la requete HTTP ...
int i;
if ((i = send(sk, req, strlen(req), 0)) == -1) { printf ("erreur send()"); return -1; }

// ... et reçoit la sauce
char buf[512];
int total = 0;
while (i = recv(sk, buf, sizeof(buf), 0))
{
 buf[i]=0;
 printf("%s\n", buf);
 total += i;
}

if (close(sk)==-1) { printf ("erreur close()"); return -1; }

printf("Socket fermé (%d octets recus).\n", total);


Pour ne pas spammer la console écris tout direct dans un fichier:

[code] FILE *fp = fopen("recv.txt", "wb");
while (i = recv(sk, buf, sizeof(buf), 0) )
{
buf[i]=0;
//printf("%s\n", buf);
fwrite (buf, 1, i, fp);
}
fclose(fp);[/code]

Voilà ici ça marche du tonnerre. Je suis sous linux, il y a juste une différence close() au lieu de closesocket(). Mais la fonction de connection elle est pour windows (WSAloperies).


Voilà bonne chance pour la suite. Il y a de fortes chances que le serveur envoie des données compressées (Transfer-Encoding: chunked). Ca c'est le header HTTP qui te le dira!


Cette discussion est classée dans : code, www, sin, sock, fr


Répondre à ce message

Sujets en rapport avec ce message

[devcpp] erreur de lieur [ par Ar4gorn ] Bonjour, Voila je developpe un leger client-serveur et avec dev-cpp c'est galere du moins au niveau de l'édition des liens. Je ne sais pas quoi mettr Prog C - Socket Windows .... [ par JimyRyan ] Bonjour.Je suis sur le point de finir un programme d'envoie de mail automatique avec pièce jointe.Mon problème est le suivante :Lors de l'envoie de la CreateProcess sur socket [ par Stormy ] Je cherche un moyen d'associer une socket avec un CreateProcess afin de lancer un shell sur CMD. Malheureusement, je ne trouve pas de liens intéressan Problm de Linkage [ par Stormy ] J'ai ce code à compiler sous MSVC 6. Or, bien que mes options de Link soient justes (il me semble), j'obtiens une erreur de linkage:fatal error C1083: Question Socket [ par LordBob ] Bonjour,voila je part à la decouverte des sockets, mais je recontre deja un probleme et j'espere que quelqu'un pourras me dépané... voici donc ma port [serveur]telecharger fichier [ par lombredudragon ] Avec les socket je debute et j'aimerais me faire un serveur en c ou c++ ou kan on se connect au port 23 par telnet on recoit automatiquement un fichie erreur 10038 [ par made_in_france ] Hello ! j'ai un probleme avec la fonction bind de mon programme. En effet cette fonction me renvois l'erreur 10038 « attempted ». Est ce que quelqu'un SVP besoin d'aide [ par seito ] [size=5] seito [/size]j'ai déveloper une apploication pour transferer des fichiersla reception est parfaite pourtant à l'envoie ça me cause des tas de transfert de fichier sous MFC [ par seito ] [size=5] seito [/size]bonjours,j'aimerais déveloper une application de transfert de fichier sous MFC avec Visual C++ 6.le code que j'ai conçus marche client serveur [ par elanspeech ] Bonjour,Je suis en train de programmer un petit client serveur en C pour windows avec dev-c++. J'obtiens l'erreur suivante a la compilation : D:\DEV-C


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,448 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales