C requête http ne fonctionnant pas

Signaler
Messages postés
16
Date d'inscription
samedi 21 février 2009
Statut
Membre
Dernière intervention
21 mars 2013
-
Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
-
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:
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 ;)

5 réponses

Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
8
Salut, essaie en remplaçant:
    sock = socket(AF_INET, SOCK_STREAM, 0);

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



C++dialement,

Pop70
Messages postés
16
Date d'inscription
samedi 21 février 2009
Statut
Membre
Dernière intervention
21 mars 2013
2
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.
Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
8
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 :

if (connect(sock, (SOCKADDR*)&sin, sizeof(sin)) == -1)
   perror("Erreur connexion");


Pop70
Messages postés
16
Date d'inscription
samedi 21 février 2009
Statut
Membre
Dernière intervention
21 mars 2013
2
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:

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



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 ;)
Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
3
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:
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;
}



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:

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:

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


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!