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 :

Socket multicast UDP


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 117
    Points : 33
    Points
    33
    Par défaut Socket multicast UDP
    Bonjour,

    Je voudrais faire l'équivalent de ceci (java) en python :

    Soit une classe Transmitter qui définit :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        socket = new DatagramSocket();
        socket.connect(mcastAddr, mcastPort);
    et une classe Receiver qui définit :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        mSocket = new MulticastSocket(mcastPort);
        mSocket.joinGroup(mcastAddr);
    Déjà, comment fonctionne le joinGroup(), exactement ? J'avoue ne pas bien maîtriser le fonctionnement du multicast UDP...

    J'ai trouvé quelques discussions/lignes de codes en python, mais il y a rarement la partie réception, et toutes les implémentations diffèrent ! J'aimerais savoir laquelle est la plus robuste :

    http://bip.weizmann.ac.il/course/pyt...multicast.html
    http://chaos.weblogs.us/archives/164
    http://wiki.python.org/moin/UdpCommunication
    http://engineering.bittorrent.com/20...ittorrent-live

    Merci d'avance pour tout conseil.

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 933
    Points : 7 343
    Points
    7 343
    Par défaut
    Peut-être une réponse ici?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 117
    Points : 33
    Points
    33
    Par défaut
    Ah, je n'avais pas trouvé cette discussion. Il y a surtout un lien très intéressant :

    https://pypi.python.org/pypi/py-multicast

    C'est tout bien organisé sous forme objet. Je teste ça...

    Merci !

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 933
    Points : 7 343
    Points
    7 343
    Par défaut
    Attention py-multicast n'est pas portable

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 117
    Points : 33
    Points
    33
    Par défaut
    Ah, OK. Une idée de ce qui ne passe pas ailleurs que linux ?

    Bon, ce n'est pas très grave, car je vis principalement OpenWRT comme target...

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 117
    Points : 33
    Points
    33
    Par défaut
    Bon, j'adapte le code de multicast-py à mes besoins. J'ai simplifié pour n'avoir qu'une seule classe, qui peut s'utiliser en tant que socket pour émettre, ou pour recevoir (plus ou moins exclusivement ; y'aura peut-être des vérification à ajouter).

    Voici ce que ça donne pour l'instant :

    Code python : 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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    class MulticastSocket(socket.socket):
         def __init__(self, port, address=""):
            """
            If address is given, the socket acts as sender to this address, otherwise the socket acts as receiver.
            In this case, call joinGroup() to tell which address to listen to.
            """
            super(MulticastSocket, self).__init__(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
     
            self._port = port
            self._address = address
     
            self.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            try:
                self.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
            except AttributeError:
                print "DEBUG::system doesn't support SO_REUSEPORT"
            self.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_TTL, 20)
     
            self.bind(("", port))
     
        def joinGroup(self, address):
            """ Listen to the given multicast address
            """
            if self._address:
                print "WARNING::socket already used as sender (bound to %s)" % self._address
     
            multicast = ord(socket.inet_aton(address)[0]) in range(224, 240)
            if not multicast:
                raise Exception("address is not a multicast destination (%s)" % repr(address))
     
            self.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 1)
     
            value = struct.pack("=4sl", socket.inet_aton(adress), socket.INADDR_ANY)
            self.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, value)
     
        def send(self, data, address=0):
            if address:
                self._address = address
            if self._address:
                length = 0
                while length < len(data):
                    l = self.sendto(data, (self._address, self._port))
                    length += l
            else:
                raise Exception("destination address not set")
     
        def receive(self):
            return self.recvfrom(255)

    Déjà, voyez-vous des grosses boulettes ?

    D'autre part, comment fait-on pour retrouver le port local utilisé par le socket une fois qu'il est lié (bind) ? J'ai besoin de cette info pour éviter les boucles infinies lorsque je vais recevoir des paquets...

    Merci d'avance.

Discussions similaires

  1. Socket multicast UDP
    Par fma38 dans le forum Réseau
    Réponses: 2
    Dernier message: 12/08/2013, 21h00
  2. Socket en UDP - Multicast - Chat - Problème.
    Par ExSter dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 02/09/2010, 12h48
  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
  5. [Debutant] Problème Socket Linux UDP
    Par AxldenieD dans le forum Réseau
    Réponses: 3
    Dernier message: 01/11/2005, 17h08

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