Problème serveur http, requêtes successives

Résolu
lkm Messages postés 43 Date d'inscription vendredi 28 mai 2004 Statut Membre Dernière intervention 23 novembre 2007 - 10 août 2005 à 19:50
lkm Messages postés 43 Date d'inscription vendredi 28 mai 2004 Statut Membre Dernière intervention 23 novembre 2007 - 13 août 2005 à 11:05
Bonsoir à tous,

je suis en train de réaliser un petit client http qui à pour but de me loguer sur un site puis de parcourir quelques pages de ce même site. Avant de faire tout ça j'ai fait quelques tests:
Jusqu'ici j'ai réussi à envoyer des variables grace à la méthode POST.
Je récupère également le code html grace à la méthode GET
Cependant lorsque je réuni les 2, à savoir un envoi POST puis un envoi de GET, il semble que le serveur http ne reçoit pas la deuxième requete.

Comme il est indiqué dans le topic :http://www.cppfrance.com/forum.v2.aspx?id=429469, j'ai essayé de mettre un sleep entre les 2 envois : pas de résultats.

voici mon code, je me suis inspiré du topic :http://www.cppfrance.com/forum.v2.aspx?id=145537
çela marche en local sur un serveur php Appache, je n'ai pas mis le code de la page php qui reçoit le code car c'est vraiment trivial



<HR>


#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
#pragma comment(lib, "ws2_32.lib")

SOCKET s;
in_addr addr;
sockaddr_in sin;
hostent * host;
WSADATA wsa;
char buf[1024];
char buf2[1024];
int octet = 0;

void sleep(int nbr_seconds)
{ clock_t goal;
goal = (nbr_seconds * CLOCKS_PER_SEC) + clock();
while(goal > clock()) {
; }}

int main(void)
{
WSAStartup(0x0202, &wsa);

s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(s == SOCKET_ERROR){
printf("socket : %d\n", WSAGetLastError());
}

host = gethostbyname("localhost");

memcpy(&addr, host->h_addr, host->h_length);
sin.sin_family = AF_INET;
sin.sin_port = htons(80); // HTTP
sin.sin_addr = addr;

if(SOCKET_ERROR == connect(s,(sockaddr*)&sin, sizeof(sin))){
printf("connect : %d\n", WSAGetLastError());
}

strcpy(buf, "POST /test.php HTTP/1.0\r\n Host: 127.0.0.1\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length:11\r\n\r\n var=canaris\r\n\r\n");
send(s, buf, strlen(buf), 0);

octet = recv(s, buf, sizeof(buf), 0);
for(int m=0; m<octet; m++)
printf("%c", buf[m]);

sleep(5);

strcpy(buf2, "GET /test.php HTTP/1.0\n\n"); // la requete http
send(s, buf2, strlen(buf2), 0);
octet = recv(s, buf, sizeof(buf), 0);
for(int i=0; i<octet; i++)
{printf("%c", buf[i]);}

closesocket(s);
WSACleanup();
return 0;
}



<HR>




lkm

8 réponses

lkm Messages postés 43 Date d'inscription vendredi 28 mai 2004 Statut Membre Dernière intervention 23 novembre 2007
13 août 2005 à 11:05
Ok dac simtiers j'ai en effet eu le problème, c'est vraiment bizarre, en ce qui concerne ma dernière question (code html en entier) voici la réponse : http://www.cppfrance.com/forum.v2.aspx?id=373480
Il me reste encore pas mal de trucs a faire pour finir mon programme parce que pour l'instant je n'ai fais que des tests mais c'est bien parti. Je vous tiendrais au courant de l'évolution de mon programme. Merci à ceux qui m'ont aidé

lkm
3
simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006
10 août 2005 à 19:59
Salut !



Je crois que le problème, c'est que par défaut en HTTP, tu est en mode
connection-close : tu dois fermer la socket avant de lancer la 2e
requête.

Pour changer le mode, il faudrait passer en mode "keep-alive", je sais plus dans quel attributs dans l'en-tête....



Un bon site ou tu doit trouver ça :

http://www.iprelax.fr/ (ancien salemioche => excellent pour les infos sur ce protocole)
0
lkm Messages postés 43 Date d'inscription vendredi 28 mai 2004 Statut Membre Dernière intervention 23 novembre 2007
10 août 2005 à 21:10
Bravo simtiers d'avoir pensé à ça,
En effet le protocole HTTP est un protocole en "mode non connecté" qui est une couche supérieure au protocole TCP. Je m'en souviens maintenant, j'avais vu ça en cours de réseau il y a quelques mois. Enfin bon, tout ça n'arrange pas mes affaires je me rend compte que je ne vais pas pouvoir utiliser cette technique. d'ailleurs je ne vois pas comment je vais pouvoir faire. Tu n'aurais pas une idée? je résume ce que je veux faire : je veux me logguer sur un site puis parcourir quelques pages (récupérer le code, ou visualiser les pages) tout en étant logué.
Il y a peut être la solution d'utiliser le contrôle activeX "Internet Explorer" mais je n'ai pas la moindre idée de comment il fonctionne et je n'ai pas trouvé d'exemple pour l'utiliser.
Enfin je veux influencer personne, si quelqu'un a d'autres méthodes: à vos claviers!
Merci d'avance.

lkm
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
10 août 2005 à 22:59
Simtiers t'as donné la réponse. Tes requetes doivent porter le flag keepalive. Il me semble que tous les serveurs et proxys HTTP actuels supportent le keepalive.

Cordialement,
Xterminhate.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006
11 août 2005 à 12:00
Le flag en question est :"Connection"

Par défaut, les navigateurs (Firefox, Opera, IE....) envoient les requêtes avec le flag :

Connection: close


Pour ton cas, il faudrait plutot mettre le flag :

Connection: Keep-Alive


Ceci dit, le flag Connection n'est utile qu'en HTTP 1.0.

Depuis le HTTP 1.1, toutes les connections sont en Keep-Alive, et il
faut préciser Connection: close pour fermer la socket en fin de
transfert pour un fichier
0
lkm Messages postés 43 Date d'inscription vendredi 28 mai 2004 Statut Membre Dernière intervention 23 novembre 2007
11 août 2005 à 22:11
ok merci pour ces informations
en effet Keep-Alive fonctionne bien, pour ceux qui ont des problèmes la syntaxe est : Connection: Keep-Alive et se place devant le Host pour le protocole HTTP 1.1. Sans ça ma requête ne fonctionne pas.
Par contre j'ai eu des trucs bizarres, en effet en local avec un serveur php qui tourne, je recoit bien les données de test.php mais, et c'est là que c'est original, je reçois également le code html de la page index.php du serveur (en loccurence celle d'easyphp). Par contre sur un serveur externe ça marche bien.Si quelqu'un sait pourquoi je reçoit une telle chose ça serai interessant.
Ce petit truc bizarre m'a permis de me rendre compte que je ne reçois pas le code html du premier coup et apparement ce n'est pas a cause de la taille du buffer de reception.
Comment puis-je récupérer tout le code html et détecter la fin de l'envoi?
J'ai remarqué également qu'un fois ou j'envoi la donnée qui logiquement me logue, lorsque je fais un GET de la page ou je devrais être logué, il ne me considère pas comme tel.
ça par contre ça me pose un problème, j'ai pensé à utiliser le "PHPSESSID" qui est renvoyé par le "Set-Cookie:" je suis en train de faire des tests et ça devrait marcher mais si quelqu'un à une autre idée je suis preneur.
Je vous tiendrais au courant de mon avancée. Merci encore

lkm
0
lkm Messages postés 43 Date d'inscription vendredi 28 mai 2004 Statut Membre Dernière intervention 23 novembre 2007
11 août 2005 à 22:19
Voila chers amis
J'ai réussi à simuler le fait d'être logué grâce au PHPSESSID et au message "Cookie:" J'ai toujours des problèmes pour récupérer l'ensemble du code html en une seule fois mais c'est déjà ça. Si vous avez des questions sur ce point n'héssitez pas.

lkm
0
simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006
12 août 2005 à 10:53
Attention, si tu utilises EasyPHP, remplace le fichier index.php dans
le repertoire /www de EasyPHP par ton fichier, sinon tu risques d'avoir
un mini conflit de nom de fichiers (ça m'est arrivé)
0
Rejoignez-nous