编程接口指南

接收 IPv6 多点传送数据报

主机必须成为一个或多个 IP 多点传送组的成员,才能接收 IP 多点传送数据报。 进程可以使用以下套接字选项请求主机加入多点传送组:

    struct ipv6_mreq mreq;

    setsockopt(sock, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq, sizeof(mreq)) 

其中,mreq 为以下结构:

    struct ipv6_mreq {

        struct in6_addr ipv6mr_multiaddr;   /* IPv6 multicast addr */

        unsigned int    ipv6mr_interface;   /* interface index */

    }  

每个成员都与单个接口关联。可以在多个接口上加入同一组。 将 ipv6_interface 指定为 0 以选择缺省的多点传送接口。为主机的其中一个接口指定接口索引以选择此具有多点传送功能的接口。

要离开组,请使用:

    struct ipv6_mreq mreq;

    setsockopt(sock, IPPROTO_IPV6, IP_LEAVE_GROUP, &mreq, sizeof(mreq))  

其中,mreq 包含用于添加成员关系的那些值。当关闭套接字或中止保存套接字的进程时,此套接字将删除关联的成员关系。 可以有多个套接字请求成为特定组的成员。直到删除最后一个请求,主机才不再是此组的成员。

如果任一套接字已请求成为数据报目标组的成员,则内核 IP 层将接受传入的多点传送包。多点传送数据报是否传送到特定的套接字取决于与此套接字关联的目标端口和成员关系,或者取决于原始套接字的协议类型。要接收发送到特定端口的多点传送数据报,请将其绑定到本地端口,同时不指定本地地址,如使用 INADDR_ANY

如果在 bind(3SOCKET) 之前存在以下内容,则可以将多个进程绑定到同一 SOCK_DGRAM UDP 端口:

    int one = 1;

    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one))  

在这种情况下,所有绑定到此端口的套接字将接收每个目标为共享端口的传入多点传送 UDP 数据报。 为了向后兼容,此传送适用于传入的单点传送数据报。无论单点传送数据报的目标端口绑定有多少套接字,此类数据报永远都不会传送到多个套接字。 SOCK_RAW 套接字不要求 SO_REUSEADDR 选项共享单一 IP 协议类型。

可以在 <netinet/in.h> 中找到与多点传送相关的新套接字选项所需的定义。 所有 IP 地址均以网络字节顺序传递。