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 :

cherche exemple client udp socket


Sujet :

Réseau/Web Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 31
    Points : 24
    Points
    24
    Par défaut cherche exemple client udp socket
    Bonjour à tous.

    Ce n'est pas faute d'avoir cherché en long et en large, de tester en vain un bout de code pour récupérer une suite de 96 octets que me retourne un serveur local(localhost) en UDP.

    Je pensais trouver facilement un exemple "client udp" sur lequel me reposer, que nenni. je ne trouve que des exemples pour du tcp.
    Mes maigres compétences me font perdre mon latin entre class, methode, self je décode pas tous du class BasicUDPTest(ThreadedUDPSocketTest): de testsocket.py

    ------
    Le serveur (un simulateur de conduite) m'envoie toutes les X milllisecondes cette suite d'infos: (on peux forcer ce x dans le serveur).

    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
    Each update sends the following UDP packet :
     
    unsigned int    Time;           // time in milliseconds (to check order)
    char            Car[4];         // Car name
    word            Flags;          // Combination of OG_FLAGS, see below
    byte            Gear;           // Reverse:0, Neutral:1, First:2...
    byte            SpareB;
    float           Speed;          // M/S
    float           RPM;            // RPM
    float           Turbo;          // BAR
    float           EngTemp;        // C
    float           Fuel;           // 0 to 1
    float           OilPress;       // BAR
    float           Spare1;
    float           Spare2;
    float           Spare3;
    float           Throttle;       // 0 to 1
    float           Brake;          // 0 to 1
    float           Clutch;         // 0 to 1
    char            Display1[16];   // Usually Fuel
    char            Display2[16];   // Usually Settings
    int             ID;             // (optional ID - if specified in cfg.txt)
    Le bout de code

    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
    # -*- coding: iso-8859-1 -*-
    import socket
     
    host="127.0.0.1"
    port=56661
    s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    print "connecting ..."
    s.connect((host, port))
    print "connected"
    infoLFS=[] # Liste qui contiendra les 96 octects chaque x millisecondes
    while 1:
     
        # appel du module "va lire les 96 octects que t'envoie le serveur en udp" 
     
        # je traite ici les octects dont j'ai besoin (déjà develloper)
     
        if raw_input("Tapez q pour quitter: ")=="q":
             break
    conn.close()
    s.close()
    Si une âme charitable pouvait m'aider à créer un module qui récupères chaque x millisecondes quelques octects d'un serveur en UDP..., je tourne en rond et il me semble que je ne suis pas le seul à la lecture d'autres post.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 89
    Points : 107
    Points
    107
    Par défaut
    infoLFS = list(s.recv(1024))

    sinon pour un exemple complet UDP :

    http://www.evolt.org/article/Socket_...thon/17/60276/

    avec screenschots et le code quasiment commenté ligne par ligne.
    9a sera difficile de faire mieux
    @++

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Merci beaucoup pour ce lien jpcw2002.

    Grand soulagement, je vais pouvoir poursuivre mon projet.

    ------
    ATTENTION:

    Ca bug avec le shell windows

    (c'est pour cela que j'ai galèré en pensant que mon code avait un problême
    avant de m'en rendre compte)

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Y'a un hic !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    infolfs=[]
    while 1:
        data,addr = UDPSock.recvfrom(buf)
        infolfs.append(data)
        x=str(infolfs)
        print "buffer:",x
        # print data            <-- c'est idiot d'avoir testé
        # y=x.index("\00")    <-- ValueError substring no found 
        #print "index :",y
        infolfs=[]
    Tout serait beau dans le meilleur des mondes si je n'avais que des octects compris entre 32 et 128. (une histoire d'unicode, pour sur)

    Sauf que dans mon cas (le tableau au début du post) la valeur de chaque octet peut prendre n'importe quel valeur (\x00 < v < \xff)

    Voici par exemple ce que cela retourne

    buffer: ['\xf6=\x80\x00XFR\x00\x08\xc0\x03\x007\xc07?\xf6\xdf\xb4D\x00\x00\x00\x
    00\x00\x00\x00\x00`\x02\x05>\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
    \x00\x00\x00\x1db\x12=\x00\x00\x00\x00\x00\x00\x80?Fuel 9.1 \x00\x00\x00\x00B
    rake Bal F 84%\x00']
    buffer: ['\x00>\x80\x00XFR\x00\x08\xc0\x03\x00n\x967?\xf6\xdf\xb4D\x00\x00\x00\x
    00\x00\x00\x00\x00_\x02\x05>\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
    \x00\x00\x00\x1db\x12=\x00\x00\x00\x00\x00\x00\x80?Fuel 9.1 \x00\x00\x00\x00B
    rake Bal F 84%\x00']
    buffer: ['\x14>\x80\x00XFR\x00\x08\xc0\x03\x00]Z7?\xf6\xdf\xb4D\x00\x00\x00\x00\
    x00\x00\x00\x00]\x02\x05>\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0
    0\x00\x00\x1db\x12=\x00\x00\x00\x00\x00\x00\x80?Fuel 9.1 \x00\x00\x00\x00Brak
    e Bal F 84%\x00']
    buffer: ['(>\x80\x00XFR\x00\x08\xc0\x03\x00\x05\x117?\xf6\xdf\xb4D\x00\x00\x00\x
    00\x00\x00\x00\x00[\x02\x05>\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
    \x00\x00\x00\x1db\x12=\x00\x00\x00\x00\x00\x00\x80?Fuel 9.1 \x00\x00\x00\x00B
    rake Bal F 84%\x00']


    Le premier unsigned int est tronqué(caractere null en début de chaine ...), certains octets se transforment en word, par contre les char ont l'air d'étre bien interprété .

    J'ai épuiser ma boite d'aspro, fait le tour des string, d'unicode, lut de la doc unix sur recvfrom( bufsize[, flags]) ...
    et que y=x.index("\00") est une hérésie

    Rien n'y fait, alors que je suis persuader qu'en 2 lignes magics, je vais pouvoir manipuler cette suite de 96 octets.

    (il est à noté que le 5' octet est toujours x00).

    Je vous met avec regret encore à contribution.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 89
    Points : 107
    Points
    107
    Par défaut et avec ça ?
    import struct

    1er point tu as lu trop vite mon post précédent :

    J'ai écrit : UDPSock.recv(buf) et non UDPSock.recvfrom(buf)

    databrut=s.recv(96)
    data=struct.unpack("!lffffffffetc....", databrut)
    time=data[0]
    doit te donner l'entier correspondant a ton unsigned integer de l'heure.
    vu ce que tu as marqué dans ton premier post.

    La doc sur struct et ses méthodes

    http://docs.python.org/lib/module-struct.html

    si après ça t'aime pas python

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Autant pour moi pour la confusion recv et recvfrom (surement ma vision de nuit)

    Pour struct, je l'avais déjà repéré, imprimé et testé sans grand résultat. Mais ton exemple m'a mit la puce à l'oreille.

    Merci pour le bon coup de main au débutant que je suis !

    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
    # -*- coding: cp1252 -*-
     
    from socket import *
    import os
    import struct
     
    # set socket parametre
    host="127.0.0.1"
    port=56661
    addr = (host,port)
     
    # creer socket et bind
    s=socket(AF_INET,SOCK_DGRAM)
    s.bind(addr)
    print "en attente de données"
     
    while 1:
        databrut=s.recv(96)
        infolfs=list(s.recv(96))
            # verif données attendus sont ok
        print len(infolfs),"buf:",infolfs [8:10]
        y=infolfs.index("\00") 
        print "index :",y
     
     
    UDPSock.close()

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

Discussions similaires

  1. cherche tuto ou exemple sur les sockets unix
    Par razam dans le forum Réseau
    Réponses: 14
    Dernier message: 24/10/2007, 17h18
  2. Programmation socket: client UDP
    Par ThE_BuG87 dans le forum C++
    Réponses: 3
    Dernier message: 08/01/2007, 12h25
  3. [SOCKET] Client UDP sur système Unix
    Par be_tnt dans le forum Développement
    Réponses: 1
    Dernier message: 14/04/2006, 21h31
  4. [Socket] Client UDP
    Par AxldenieD dans le forum Réseau
    Réponses: 12
    Dernier message: 22/11/2005, 12h59

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