IPv6 multicast di indirizzamento: sono tutti “ID Gruppo” considerata valida / user-assegnabile?

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

  •  13-09-2019
  •  | 
  •  

Domanda

Sto vedendo alcuni comportamenti "interessanti" in IPv6 multicast routine di collegamento locale del mio programma. Sembra che se ho impostato uno qualsiasi dei 16 bit superiori del campo ID Gruppo 112-bit, quindi MacOS / X non accetterà più questi pacchetti multicast. La mia domanda è, è questo un bug nello stack di rete / X MacOS, o c'è qualche ragione per cui l'impostazione dei 16 bit superiori del campo ID gruppo influenzerebbe il comportamento di routing?

informazioni più specifiche segue:

  • Il multicasting da un Mac ad un altro Mac funziona sempre (testato su 10.5 e 10.6)

  • Il multicasting da Linux a Windows funziona sempre

  • Il multicasting da Mac a Windows o Windows a Mac, o Linux a Mac, funziona solo se i 16 bit superiori del ID Gruppo nel indirizzo multicast sono impostati a zero. Ad esempio:

  • FF02 :: 666 opere
  • FF02: 0: ffff :: 666 opere
  • FF02: 1 :: 666 non funziona
  • FF02: 8000 :: 666 non funziona

    • Nella "non funziona" casi, WireShark in esecuzione sul Mac dimostra che il Mac ha ricevuto i pacchetti multicast, ma i pacchetti non sono mai passati per l'applicazione ricevente (s) su Mac. Questo significa che lo stack di rete Mac ha un bug, o c'è qualche magia più profonda per l'indirizzamento multicast che io non sono a conoscenza?
        
  • È stato utile?

    Soluzione

    Stai unendo il gruppo multicast prima? Devi dire in modo esplicito il sistema operativo il gruppo che si desidera partecipare prima che vi consegneranno i messaggi di un gruppo. C'è un comando è possibile accedere con setsockopt() di aderire ad un gruppo multicast. Dal Darwin ip6 pagina di manuale :

    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.
    

    Ho trovato qualche esempio di codice qui :

    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));
    

    Ma forse si sta facendo già questo?

    Autorizzato sotto: CC-BY-SA insieme a attribuzione
    Non affiliato a StackOverflow
    scroll top