IPv6 adressage multidiffusion: sont tous « ID de groupe » considérée comme valide / incessible utilisateur?

StackOverflow https://stackoverflow.com/questions/1461872

  •  13-09-2019
  •  | 
  •  

Question

Je vois un comportement « intéressant » dans liaison locale routines IPv6 multidiffusion de mon programme. Il semble que si je mets l'un des 16 bits supérieurs du champ ID de groupe 112 bits, Mac OS / X ne plus accepter les paquets de multidiffusion. Ma question est, est-ce un bogue dans la pile réseau Mac OS / X, ou est-il une raison pour laquelle le réglage des 16 bits supérieurs du champ ID de groupe aurait une incidence sur le comportement de routage?

info spécifique suit:

  • Multicast d'un Mac à un autre Mac travaille toujours (testé sur 10,5 et 10,6)

  • Multicast de Linux à Windows fonctionne toujours

  • Multicast de Mac à Windows ou Windows à Mac, ou Linux à Mac, ne fonctionne que si les 16 bits supérieurs de l'ID de groupe dans l'adresse de multidiffusion sont mis à zéro. Par exemple:

  • FF02 :: 666 œuvres
  • FF02: 0: ffff :: 666 œuvres
  • ff02: 1 :: 666 ne fonctionne pas
  • ff02: 8000 :: 666 ne fonctionne pas

    • Dans la section « ne fonctionne pas » cas, WireShark en cours d'exécution sur le Mac montre que le Mac a reçu les paquets de multidiffusion, mais ces paquets ne sont jamais transmis à l'application de réception (s) sur le Mac. Est-ce que cela signifie que la pile réseau Mac a un bug, ou est-il un plus profond magique pour la multidiffusion que je ne suis pas au courant?
        
  • Était-ce utile?

    La solution

    vous rejoignons le groupe de multidiffusion d'abord? Vous devez indiquer explicitement le système d'exploitation du groupe que vous voulez joindre avant qu'il ne vous livrera les messages d'un groupe. Il y a une commande que vous pouvez accéder à setsockopt() à se joindre à un groupe de multidiffusion. De Darwin ip6 manpage :

    IPV6_JOIN_GROUP struct ipv6_mreq *
        Join a multicast group.  A host must become a member of a multicast group before it can receive
        datagrams sent to the group.
    
        struct ipv6_mreq {
                struct in6_addr ipv6mr_multiaddr;
                unsigned int    ipv6mr_interface;
        };
    
        ipv6mr_interface may be set to zeroes to choose the default multicast interface or to the index
        of a particular multicast-capable interface if the host is multihomed.  Membership is associ-
        ated with a single interface; programs running on multihomed hosts may need to join the same
        group on more than one interface.
    
        If the multicast address is unspecified (i.e., all zeroes), messages from all multicast
        addresses will be accepted by this group.  Note that setting to this value requires superuser
        privileges.
    

    J'ai trouvé quelques exemples de code :

    struct ipv6_mreq mreq6;
    memcpy(&mreq6.ipv6mr_multiaddr, &(((struct sockaddr_in6 *)addr)->sin6_addr),
           sizeof(struct in6_addr));
    mreq6.ipv6mr_interface= 0;
    
    err = setsockopt(sockfd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq6, sizeof(mreq6));
    if (err) fprintf(stderr, "setsockopt IPV6_JOIN_GROUP: %s\n", strerror (errno));
    

    Mais peut-être que vous faites déjà?

    Licencié sous: CC-BY-SA avec attribution
    Non affilié à StackOverflow
    scroll top