IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Protocole HTTP connexion persistante


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 87
    Par défaut Protocole HTTP connexion persistante
    Bonjour,
    j'utilise cette fonction pour aspirer une page web :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    char *bor_aspire_page(int sock,char *page,char *url)
    {
    	int pos;
    	int k;
    	char tmp[200];
    	char tpm[100];
    	char *buf;
     
    	buf = malloc(sizeof(char) * MAX_MESS);
    	sprintf(tmp,"GET /%s HTTP/1.1\r\nHost: %s\r\nAccept: */*\r\nConnection: Keep-Alive\r\n\r\n",page,tpm);
     
    	if(send(sock,tmp,strlen(tmp),0) < 0)
    	{
    		perror("write");
    		return NULL;
    	}
     
    	pos=0;
    	while(1)
    	{
    		k=recv(sock,buf+pos,MAX_MESS-pos-1,0);
    		if(k <= 0)
    		break;
     
    		pos+=k; 
     
    		if(pos > MAX_MESS-1)
    		break;
    	}
     
    	return buf;
    }
    Je l'utilise dans une boucle while,
    a la premiere itération la page est bel et bien téléchargé, avec comme réponse du serveur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    HTTP/1.1 200 OK
    Date: Sun, 15 Jun 2008 12:19:44 GMT
    Server: Apache/1.3.37 (Unix)
    Last-Modified: Sun, 15 Jun 2008 12:01:04 GMT
    Keep-Alive: timeout=15
    Connection: Keep-Alive
    Transfer-Encoding: chunked
    Content-Type: text/html
    A la deuxième itération, recv() renvoie 0.

    J'en ai déduis que j'avais été deconnecté du serveur, j'ai essayé d'utiliser les connections http persistantes, en utilisant le protocole http 1.1 puis modifier les headers (Connection: Keep-Alive), d'ailleur le serveur me renvoie bien ceci, mais rien n'y fait.

    En plus de cela la premiere page qui est téléchargé l'est rapidement, mais la détection "de fin de téléchargement" prend un peu de temps, meme énormément de temps, alors qu'en utilisant http 1.0 ca va très vite.

    Si quelqu'un pouvait m'éclairer
    Merci

  2. #2
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    2 choses :
    - poste ton code en entier pour voir les problèmes que tu mentionnes
    - que t'attends tu à recevoir comme données dans ta boucle si tu n'émets pas de nouvelles requêtes?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 87
    Par défaut
    Salut,
    oui bien sur j'émet une nouvelle requete,
    tu as mal lu, c'est l'appel a la fonction bor_aspire_page() qui est dans une boucle,

    mon code c'est donc la fonction ci dessus plus ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char *mess;
     
    mess = bor_aspire_page(sock[args->idcur],"page1.html",domaine);
    printf("==> %s <==\n",mess);
    mess = bor_aspire_page(sock[args->idcur],"page2.html",domaine);
    printf("==> %s <==\n",mess);
    Ca vient il me semble des headers HTTP 1.1, j'ai lu qu'il fallait etre vigilant et que d'autres personnes ont ce problème, mais je n'arrive absolument pas à le régler.

    Lorsque je ferme la socket et la reconnecte à chaque fin de téléchargement de page, la requete suivante est bien traité et j'ai une réponse du serveur, mais les deux à la suite non, je suis apparemment déconnecté du serveur à la fin de la première.

  4. #4
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    OK, il s'agit d'un problème de conception, dans l'entête HTTP renvoyé tu dois logiquement avoir un champs "Content-Length" t'indiquant le nombre exact de bytes à lire après l'entête, hors toi, tu essayes d'en lire plus, du coup, il n'y a rien à lire, et la connexion se ferme une fois de délai de keep-alive écoulé (d'ou le temps "très long" de détection de fin de page que tu crois).

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 87
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    OK, il s'agit d'un problème de conception, dans l'entête HTTP renvoyé tu dois logiquement avoir un champs "Content-Length" t'indiquant le nombre exact de bytes à lire après l'entête, hors toi, tu essayes d'en lire plus, du coup, il n'y a rien à lire, et la connexion se ferme une fois de délai de keep-alive écoulé (d'ou le temps "très long" de détection de fin de page que tu crois).
    Effectivement je dois lire la ou il ne faut pas a un moment et c'est pour ca que le serveur ferme la connection, mais le serveur me renvoie "Transfer-Encoding: chunked" ce qui d'après la RFC http 1.1 signifie que la taille de la réponse du serveur ne peut pas etre déterminé a l'avance. Donc il est apparemment normal que je n'ai pas de champ content-length.

    Donc je ne sais pas quoi faire pour lire correctement les données.

  6. #6
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Ah oui autant pour moi je n'avais pas vu le Transfert-Encoding.
    Dans ce cas, tu dois quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    HTTP/1.1 200 OK
    ...
    Transfer-Encoding: chunked
     
    taille du morceau en hexa
    morceau
    taille du morceau 2 en hexa
    morceau2
    taille du morceau n en hexa
    morceau n
     
    0

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/07/2010, 09h54
  2. connexion persistante http 1.1
    Par supergg02 dans le forum Web & réseau
    Réponses: 0
    Dernier message: 03/12/2007, 00h32
  3. Problème lié au protocole HTTP.
    Par giviz dans le forum Développement
    Réponses: 2
    Dernier message: 03/10/2003, 17h36
  4. [PHP & PostGreSQL] Connexion persistante & Res Id
    Par BuLma dans le forum PostgreSQL
    Réponses: 9
    Dernier message: 25/08/2003, 11h35
  5. [JDBC][connexion persistante] performances avec JDBC
    Par nawac dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 06/05/2003, 10h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo