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/Web Python Discussion :

Module socket ne lit pas les requêtes en entier


Sujet :

Réseau/Web Python

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Module socket ne lit pas les requêtes en entier
    Bonjour à tous

    Voilà j'ai codé un petit script python utilisant le module socket, qui se connecte à un site web pour me ramener le contenu d'une page web. J'utilise d'habitude urllib, mais là c'est plus compliqué donc je préfère utiliser le module socket pour mieux maîtriser ce que je fais.

    Mon problème, c'est que la page web est très longue, alors que mon programme ne me ramène pas plus de 1500 octets environ (en-tête compris). De plus, il s'arrête de façon vraiment imprévisible, en plein au milieu d'un javascript.

    Pourtant, j'ai spécifié 9000 octets à s.recv(), et ça ne change rien si j'augmente ou diminue ce nombre (tant que je reste au dessus de 1500 bien sûr).

    Avez-vous une idée d'où ce problème pourrait venir ?

    Je reste bien sûr à votre disposition pour de plus amples précisions sur le fonctionnement de mon programme.

    Merci d'avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Points : 329
    Points
    329
    Par défaut
    C'est normal c'est la fragmentation des paquets spécifiée par le mtu.
    La norme en ethernet est 1500 octets.

    http://fr.wikipedia.org/wiki/Maximum_Transmission_Unit

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup tamiel

    Après recherches, j'ai effectivement remarqué que le serveur m'envoyait de nombreux paquets avec le protocol TCP avant de répondre à ma requête par HTTP 200.

    Seulement je n'ai pas trouvé de documentation claire m'expliquant comment faire cette fragmentation, à la manière de mon navigateur.

    Y'a t-il une solution simple avec le module socket ? Ou bien faut-il que je continue avec un module plus évolué, comme urllib2 par exemple ?

    Merci encore.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    urllib est la couche qui assemble et fragmente les messages HTTP 'au dessus' de la couche TCP - accédée via _socket_.

    Je n'ai pas trop compris pourquoi vous vouliez passer 'en dessous' mais si vous avez besoin des services que cette couche apporte, il vous faudra les recoder (ce qui n'est pas forcément 'trop' compliqué')
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 114
    Points : 129
    Points
    129
    Par défaut
    Bonjour

    recv() renvoie les données disponibles de suite dans le buffer, ou se bloque jusqu'à ce que des données soient disponibles.

    Dans beaucoup de cas, surtout dans les exemples, on suppose qu'après un :

    On a les données que l'on souhaite.

    Cependant, la couche de transport (ethernet dans beaucoup de cas) peut découper les données en plusieurs paquets de la taille dite du MTU.

    Ce qui amène en faite dans la réalité à plutôt écrire des bouts de code comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    while pas_assez_de_données:
         data = data + s.recv(4096)
    où dans le cas d'une requête HTTP, où la socket est fermée à la fin de la requête, j'écrirais quelque chose comme:

    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
     
    # connexion au server
    s = socket.socket( ... )
    s.connect (...)
     
    # envoi de la requête HTTP (attention, de mémoire je ne suis pas sur du détail  
    s.send("GET ...")
     
    # réception de la réponse
    data = []
    lastPacket = " "
    while lastPacket:
        lastPacket = s.recv(4096)
        data = data + lastPacket
     
    s.close()
     
    # ici on a dans data toutes la réponse à la requête HTTP
    ...

    En espérant que cette réponse un peu redondante par rapport aux autres éclaircisse un le sujet.


    Cordialement
    Emmanuel

  6. #6
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci à tous les trois

    Je viens de faire les tests nécessaires, et j'arrive à faire ce que je voulais . Je vais donc me servir du module socket pour l'authentification puis de urllib pour la suite.

    Encore merci pour les infos

  7. #7
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Citation Envoyé par tamiel Voir le message
    C'est normal c'est la fragmentation des paquets spécifiée par le mtu.
    La norme en ethernet est 1500 octets.

    http://fr.wikipedia.org/wiki/Maximum_Transmission_Unit
    Tiens, voila peut-être la raison et solution d'un bug qui s'est posé à moi il y a plus de 6 mois, dans un petit projet perdu de vue depuis... je n'ai pas le code sous la main, mais je te remercie dors et déjà pour cette information

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/06/2008, 15h40
  2. Graveur ne lit pas les DVD
    Par marsupilami34 dans le forum Composants
    Réponses: 2
    Dernier message: 17/12/2007, 14h31
  3. mon jar ne lit pas les sons wav
    Par poulette3000 dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 13/05/2007, 19h56

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