IPv6-Multicast-Adressierung: Sind alle „Gruppen-IDs“ als gültig / frei belegbare?

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

  •  13-09-2019
  •  | 
  •  

Frage

Ich sehe etwas „interessant“ Verhalten in meinem Programm der Link-Local IPv6-Multicast-Routinen. Es scheint, dass, wenn ich einen der oberen 16 Bits des 112-Bit-Gruppen-ID-Feld gesetzt ist, dann MacOS / X wird nicht mehr auf diese Multicast-Pakete akzeptieren. Meine Frage ist, dann ist dies ein Fehler in der MacOS / X Netzwerk-Stack, oder gibt es einen Grund, warum die oberen 16 Bits der Gruppen-ID-Feld Routing-Verhalten beeinflussen würde Einstellung?

Speziellere Informationen folgt:

  • Multicasting von einem Mac auf einen anderen Mac immer funktioniert (getestet auf 10.5 und 10.6)

  • Multicasting von Linux auf Windows funktioniert immer

  • Multicasting von Mac zu Windows oder Windows auf Mac oder Linux auf Mac, funktioniert nur, wenn die oberen 16 Bits der Gruppen-ID in der Multicast-Adresse auf Null gesetzt. Zum Beispiel:

  • FF02 :: 666 Werke
  • FF02: 0: FFFF :: 666 Werke
  • FF02: 1 :: 666 funktioniert nicht
  • FF02: 8000 :: 666 funktioniert nicht

    • In den „funktioniert nicht“ Fälle, Wireshark auf dem Mac läuft zeigt, dass der Mac die Multicast-Pakete empfangen hat, aber diese Pakete werden niemals an die empfangenden Anwendung (en) auf dem Mac übergeben. Bedeutet dies, dass der Mac-Netzwerk-Stack hat einen Bug, oder gibt es etwas tiefe Magie Adressieren Multicast, dass ich bin mir nicht bewusst?
        
  • War es hilfreich?

    Lösung

    Fügen Sie die Multicast-Gruppe zuerst? Sie haben explizit die Gruppe dem O zu sagen, dass Sie teilnehmen möchten, bevor es Ihnen eine Gruppe, Nachrichten liefern. Es gibt einen Befehl, den Sie mit setsockopt() zugreifen können eine Multicast-Gruppe beizutreten. Aus dem 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.
    

    Ich fand einige Beispiel-Code hier :

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

    Aber vielleicht tust du das schon?

    Lizenziert unter: CC-BY-SA mit Zuschreibung
    Nicht verbunden mit StackOverflow
    scroll top