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 :

Problème multicast sous Linux


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 3
    Par défaut Problème multicast sous Linux
    Bonjour,

    Le fichier main.c permet d'envoyer et de recevoir des paquets multicasts sur des interfaces spécifiques. C'est à dire 128.127.58.113 pour la réception et 128.127.58.112 pour l'émission.

    L'émission se fait sur Windows XP ( 128.127.58.112) et la réception sous Linux (128.127.58.113).

    Lorsque je ne défini pas USE_RECV_ADDR, ce test fonctionne correctement mais ce n'est pas ce que je veux (il faut que le bind() soit fait sur une adresse valide et non sur toutes).

    Si je défini USE_RECV_ADDR, le message n'est pas reçu (aucun paquet multicast ne remonte dans la couche applicative) pourtant, le paquet est bien visible dans wireshark.

    Ce test (main.c) ne fonctionne pas sous Linux (ubuntu 10.4) et je ne sais pas pourquoi (Lorsque j'utilise ce test entre 2 windows, ça fonctionne très bien. C'est à dire USE_RECV_ADDR défini).

    Sous windows, il est possible de faire un bind() sur l'IP locale puis de faire du multicast sans problème par contre, sous Linux, ça ne marche pas et je ne comprends pas pourquoi. J'ai regardé les pages de man mais, ... rien.

    Quelqu'un a t'il une solution à me proposer ?

    Merci d'avance,

    Cyril
    Fichiers attachés Fichiers attachés
    • Type de fichier : c main.c (5,0 Ko, 89 affichages)

  2. #2
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Dans ton message, il y a quelque chose qui me choque :
    Multicast et les IP 128.127.xxx.xxx
    Pour moi multicast rime avec 224.xxx.xxx.xxx et plus.

    Je ne me rappelle plus, mais il y a quelque chose à faire au niveau système (interface réseau) pour qu'il accepte du (vrai) multicast.

    Les adresses en 128.xxx ne devraient pas intervenir. Par ex, l'émetteur envoie sur l'adresse 230.1.5.12 et le récepteur s'abonne à 230.1.5.12.
    Petit exemple.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 3
    Par défaut
    Dans ton message, il y a quelque chose qui me choque :
    Multicast et les IP 128.127.xxx.xxx
    Pour moi multicast rime avec 224.xxx.xxx.xxx et plus.
    Je suis d'accord avec toi, je n'ai peut-être pas été suffisamment clair dans mon message.

    Mon problème se trouve au niveau du bind() sur INADDR_ANY.

    Sous windows, il est possible de définir l'adresse de l'interface à laquelle associer une socket (128.127.XXX.XXX dans l'exemple). Cette interface sera alors utilisée pour sniffer tous les paquets entrants contrairement à INADDR_ANY qui est utilisé pour sniffer toutes les interfaces du système.

    Si par exemple, un PC est muni de 2 interfaces :
    - carte 1 : 128.127.58.10
    - carte 2 : 128.128.99.12

    Tous les paquets multicasts des 2 interfaces vont-être remontés à l'application si INADDR_ANY est utilisé.

    Par contre, si 128.127.58.10 (carte 1) est utilisé par le bind(), seul le trafic multicast sniffé par cette interface remontera à l'application.

    Ce principe améliore les performances mais pas seulement. Ceci permet la réutilisation d'un même programme sur différentes interfaces.

    Imaginons que le programme compilé soit TotoLand.exe.

    TotoLand.exe pourra être exécuté sur Carte 1 (128.127.58.10) mais aussi sur Carte 2 (128.128.99.12) sans qu'il y ait conflit entre les deux programmes pour cause de réutilisation de port/adresse.

    Une solution serait de faire un SO_REUSEADDR mais, c'est fortement déconseillé.

    J'espère avoir été un peu plus clair dans mes explications.

    Petit exemple.
    Je viens de regarder ton exemple. C'est intéressant mais, malheureusement, le bind() est fait sur INADDR_ANY.

  4. #4
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    En effet, c'est beaucoup plus clair !
    Par contre, je sèche, je n'ai jamais été confronté à la problématique multi interfaces.

Discussions similaires

  1. [LabView 8.5] Problème VI sous Linux
    Par nuFox dans le forum LabVIEW
    Réponses: 1
    Dernier message: 18/03/2008, 18h59
  2. Problème MySQL sous Linux
    Par Feysal dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 07/08/2007, 16h46
  3. Problème exec sous Linux
    Par jaggy19 dans le forum Langage
    Réponses: 4
    Dernier message: 29/06/2007, 14h13
  4. problème éxécution sous linux
    Par madmox dans le forum Général Java
    Réponses: 4
    Dernier message: 30/05/2007, 19h14
  5. Problème oracle10g sous linux debian
    Par man84 dans le forum Debian
    Réponses: 2
    Dernier message: 12/12/2006, 11h36

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