编程接口指南

接收 IPv4 多点传送数据报

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

    struct ip_mreq mreq;

    setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) 

其中,mreq 为以下结构:

    struct ip_mreq {

        struct in_addr imr_multiaddr;   /* multicast group to join */

        struct in_addr imr_interface;   /* interface to join on */

    }  

每个成员都与单个接口关联。可以在多个接口上加入同一组。 将 imr_interface 地址指定为 INADDR_ANY 以选择缺省的多点传送接口。还可以通过指定主机的本地地址之一来选择特定的具有多点传送功能的接口。

要删除成员关系,请使用:

    struct ip_mreq mreq;

    setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, &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 地址均以网络字节顺序传递。