2

我在程序的本地链接 IPv6 多播例程中看到了一些“有趣”的行为。似乎如果我设置了 112 位组 ID 字段的高 16 位中的任何一个,那么 MacOS/X 将不再接受这些多播数据包。我的问题是,这是 MacOS/X 网络堆栈中的错误,还是有某些原因设置组 ID 字段的高 16 位会影响路由行为?

更具体的信息如下:

  • 从一台 Mac 多播到另一台 Mac 始终有效(在 10.5 和 10.6 上测试)

  • 从 Linux 到 Windows 的多播始终有效

  • 仅当多播地址中组 ID 的高 16 位设置为零时,从 Mac 到 Windows、Windows 到 Mac 或 Linux 到 Mac 的多播才有效。例如:

  • ff02::666 作品
  • ff02:0:ffff::666 作品
  • ff02:1::666 不起作用
  • ff02:8000::666 不起作用

    • 在“不起作用”的情况下,在 Mac 上运行的 WireShark 显示 Mac 已接收到多播数据包,但这些数据包从未传递到 Mac 上的接收应用程序。这是否意味着 Mac 网络堆栈存在错误,或者是否有一些我不知道的多播寻址更深层次的魔力?
  • 4

    1 回答 1

    1

    你是先加入多播组吗?您必须明确告诉操作系统您要加入的组,然后它将向您发送组的消息。您可以使用一个命令setsockopt()来加入多播组。从达尔文 ip6 联机帮助页

    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.
    

    我在这里找到了一些示例代码:

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

    但也许你已经这样做了?

    于 2009-10-04T22:53:12.140 回答