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

Python Discussion :

Problème avec socket en mode bloquant sous Linux


Sujet :

Python

  1. #1
    Membre chevronné Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Par défaut Problème avec socket en mode bloquant sous Linux
    je suis en train de debuter a python et je suis en train porter une petite appli qui me sert de serveur bootp et tftp pour démarrer un os via le réseau, l'appli fonctionne sur sa version assembleur et pour le moment ça fonctionne pour le bootp lorsque que j'execute sur un ordinateur Windows 7 mais lorsque que j'essaye sur mon fedora j'ai eu une erreur comme quoi il ne reconnais pas le nom l'exception "NameError: global name 'BlockingIOError' is not defined"

    j'ai supprimé les lignes pour attraper les exceptions et il m'a affiché "socket.error: [Errno 11] Ressource Temporary unavaible"

    du coup je ne sais pas quoi faire pour que ça fonctionne sous linux/fedora est ce que quelqu'un aurait une idée?

    ça c'est le code qui fonctionne sous win7:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        socket.setblocking(False)
        try:
            donnee, addresse = socket.recvfrom(taille)
        except BlockingIOError:
            donnee, addresse = bytearray(0),("0.0.0.0",0)

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Salut,

    Citation Envoyé par bifur Voir le message
    j'ai eu une erreur comme quoi il ne reconnais pas le nom l'exception "NameError: global name 'BlockingIOError' is not defined"
    Il faut commencer par vous assurer que vous utilisez la même version de Python dans les deux environnements: BlockingIOError est Python3.

    Citation Envoyé par bifur Voir le message
    il m'a affiché "socket.error: [Errno 11] Ressource Temporary unavaible"
    Errno 11 correspond à EWOULDBLOCK EAGAIN.
    Relisez votre code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        socket.setblocking(False)
        try:
            donnee, addresse = socket.recvfrom(taille)
        except BlockingIOError:
            donnee, addresse = bytearray(0),("0.0.0.0",0)
    A cause du .setblocking(False), l'appel .recvfrom doit retourner sans attendre et s'il n'y a rien à retourner, çà ne peut rien faire d'autre que lever l'erreur EWOULDBLOCK qui sera ensuite mappée en BlockingIOError ou socket.error par Python. Vous vous simplifieriez la vie (et le code) avec un timeout différent de 0.
    note: le but est quand même de récupérer ces données sans les attendre indéfiniment.... ici vous pariez qu'il y aura des données à lire lorsque vous en aurez besoin.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre chevronné Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Par défaut
    effectivement le problème venait de la version de mon interpréteur sous linux, maintenant le système tourne sans aucune erreur mais ne reçoit aucune trame, je pense que le problème vient du pare feux de linux mais tout ceci n'as rien a voir avec python

    pour ce qui est de l'utilisation du .setblocking(False) c'est entièrement voulu, pour le moment le script doit uniquement écouter le port udp 67 pout traiter les requêtes bootp mais il faudra aussi traiter les données reçu par le port udp 69 pour traiter les requêtes tftp, je ne doit donc pas m'arrêter a attendre une requête bootp, si il n'y as aucunes données reçu on doit passer a la suite

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Citation Envoyé par bifur Voir le message
    pour ce qui est de l'utilisation du .setblocking(False) c'est entièrement voulu, pour le moment le script doit uniquement écouter le port udp 67 pout traiter les requêtes bootp mais il faudra aussi traiter les données reçu par le port udp 69 pour traiter les requêtes tftp, je ne doit donc pas m'arrêter a attendre une requête bootp, si il n'y as aucunes données reçu on doit passer a la suite
    Vous avez select pour attendre un évènement sur plusieurs sockets (qui accepte aussi un argument timeout). Ça évite de flinguer un CPU juste pour s'assurer qu'il n'y a rien à faire.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre chevronné Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Par défaut
    j'ai plutôt l'habitude de programmer des automates industriel donc j'aime pas trop les instruction qui bloque, est ce que le select permet de surveiller autre chose que des évènements sur des socket?

    je sais bien ce genre de façon de faire bouffe pas mal de ressources processeur donc j'ai inseré un "'time.sleep(0.1)" pour que limiter a 10 le nombre de test par seconde (et on passe sur ma machine de 13% processeur a moins de 1%)

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Citation Envoyé par bifur Voir le message
    j'ai plutôt l'habitude de programmer des automates industriel donc j'aime pas trop les instruction qui bloque, est ce que le select permet de surveiller autre chose que des évènements sur des socket?
    Sur linux select s'applique à n'importe quel descripteurs (fichiers, socket, pipe,..)

    Citation Envoyé par bifur Voir le message
    je sais bien ce genre de façon de faire bouffe pas mal de ressources processeur donc j'ai inseré un "'time.sleep(0.1)" pour que limiter a 10 le nombre de test par seconde (et on passe sur ma machine de 13% processeur a moins de 1%)
    Mettre un timeout sur les sockets (ou sur le select) est moins bloquant qu'un time.sleep(0.1)...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. problème de fifo bloquant sous linux
    Par Fonzy007 dans le forum POSIX
    Réponses: 6
    Dernier message: 20/05/2009, 09h44
  2. Réponses: 2
    Dernier message: 24/02/2009, 12h18
  3. Problème avec mon écran 19 pouces sous Linux
    Par Flomyr dans le forum Matériel
    Réponses: 2
    Dernier message: 17/01/2008, 20h26
  4. Problème TCP non bloquant sous Linux (C++)
    Par jmelyn dans le forum Linux
    Réponses: 4
    Dernier message: 15/11/2007, 14h27
  5. Réponses: 11
    Dernier message: 14/02/2006, 00h26

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