Hi.
Est-il possible avec les sockets de faire des requettes http et d'en récupérer les résultats ? Si oui : avez-vous des exemples, merci ?
Hi.
Est-il possible avec les sockets de faire des requettes http et d'en récupérer les résultats ? Si oui : avez-vous des exemples, merci ?
Oui c'est possible suffit d'envoyer une requete Http ( POST ou GET pour récuperer)
Pas d'exemple sous la main maisdoit avoir cela en stock
![]()
Il y a aussi quelques exemples dans le forum ...
Merci pour vos réponses mais j'ai un problème...
Voici mon code:
Fonction membre de ma classe:
Dans main:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void s_r(char *buffer) //send and receive { if(send(sock, buffer, strlen(buffer), 0)==-1){ cout<<"Erreur....."<<endl; } .... }
J'ai sniffer avec Ethereal lors de l'éxécution de se programme, il envoi bien req[] sur Internet mais ethereal reconnait ces données en tant que "TCP segment Data" et non en tant que protocole HTTP ! Faut-il spécifier quelque part qu'il s'agit du protocole HTTP ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 char req[]= "GET http://www.google.fr/index.html HTTP/1.1\r\n" "Host: www.google.fr\r\n"; test.s_r(req);
Merci...
L'en-tête HTTP se termine par une ligne vide. Ta requête devrait être :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 "GET http://www.google.fr/index.html HTTP/1.1\r\n" "Host: www.google.fr\r\n" "\r\n";
Ok, je vien d'ajouter le \r\n mais ça ne change rien au problème.
mais ça me parait tout à fait normal. Tous ce qui est envoyé suivant le protocole HTTP est envoyé par TCP.Envoyé par zenux
TCP est un protocole de couche basse. HTTP est un protocole de couche haute, basé sur TCP. Ethernal te sort des infos sur les couches basses donc tu ne peux pas en conclure que l'envoi HTTP s'est mal passé.
As-tu essayé de réceptionner le résultat de ta requête GET ?
1) Quand je sniffe avec ethereal lorsque je surf sur internet, il me dit bien que c'est un paquet ip->tcp->http.
Et lorsque j'exécute mon programme, il me dit que c'est un paquet ip->tcp : pourquoi ne reconnait-il pas le Http ?
2) Quand j'éxécute ce code, sur Ethereal je ne voit aucun paquet de la part de google entre l'envoie de ma requete et la fermeture de ma connection !:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 send(sock, buffer, strlen(buffer), 0); sleep(5); //5 sec #ifdef _WIN32 closesocket(sock); WSACleanup(); #else close(sock); #endif
Simple question : tu te connecte bien sur le port distant 80 ?
Le constructeur de ma classe:
Dans main:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 requete(char *ip, int port) { #ifdef _WIN32 WSADATA WSAData; WSAStartup(MAKEWORD(2,2), &WSAData); #endif SOCKADDR_IN sin; sin.sin_family = AF_INET; sin.sin_addr.s_addr = inet_addr(ip); sin.sin_port = htons(port); sock = socket(PF_INET, SOCK_STREAM, 0); if(connect(sock, (SOCKADDR *)&sin, sizeof(sin))==-1){ cout<<"Erreur..."<<endl; } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 char ip[] = "66.249.93.104"; int port = 80; char req[]= "GET http://www.google.fr/index.html HTTP/1.1\r\n" "Host: www.google.fr\r\n"; "\r\n"; requete test(ip, port); test.s_r(req); return 0;
je viens de faire l'essai. J'ai pris la requêteet je récupère bien la page.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 "GET http://www.google.fr/index.html HTTP/1.1\n\n" "Host: www.google.fr\n\n";
D'abord un conseil :
Tu ferais mieux de déclarer ip en const char *.
Code : Sélectionner tout - Visualiser dans une fenêtre à part requete(char *ip, int port)
Ensuite tu as oublié de retirer un point-virgule :
char req[]= "GET http://www.google.fr/index.html HTTP/1.1\r\n"
"Host: www.google.fr\r\n"; // <- ici
"\r\n";
Grrr tout ça à cause d'un ; en trop...maintenant ça fonctionne.
Bizzard que le compilateur n'a pas vu l'erreur, non ?
Non, il n'y a pas d'erreur de syntaxe ^^Envoyé par zenux
normalement c'est GET /index.html et pas GET http://....
GET http://domaine.ext est tout à fait correcte et d'ailleurs il vaut mieux l'utiliser car sinon tu auras des problèmes sur les serveurs gérant plusieurs sites / domainesEnvoyé par loufoque
L'entête Host est faite pour ça...d'ailleurs il vaut mieux l'utiliser car sinon tu auras des problèmes sur les serveurs gérant plusieurs sites / domaines
Autant on peut admettre que "GET http://mon.site/index.html" et "GET /index.html" avec l'en-tête host qui va bien sont équivalents, autant ce n'est pas vrai avec "GET /"
La page par défaut n'est pas forcément index.html, mais peut etre index.php, default.asp ou je ne sais quoi. De plus, le comportement de "GET /" n'est pas forcément d'afficher une page, ça peut etre de lister le dossier.
[edit/pour en dessous]
Oui un listing est aussi une page. Je reprenais la remarque au dessus, et faisais remarquer que "GET /" et "GET /index.html" ne sont pas équivalents.
"GET /" renvoie la page par défaut, un listing est aussi une page, ou est le problème.
Firefox fait ça:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 GET / HTTP/1.1" Host: <a href="http://www.developpez.com" target="_blank">www.developpez.com</a> ...
Partager