IP 多点广播

使用 IP 多点传送可以将信息发送到一组主机上,而不需要对每一个工作组成员进行地址标记和单独发送信息。 因特网寻址提供用于多点广播的 D 类寻址。

定义数据报套接字时,可以修改 setsockopt 子例程。 要加入或离开多点广播组,请将 setsockopt 子例程与 IP_ADD_任何成员资格IP_DROP_任何成员资格 标志配合使用。 使用的接口和使用的组是在包含以下字段的 ip_mreq 结构中指定的:

struct ip_mreq{
   struct in_addr imr.imr_interface.s_addr;
   struct in_addr imr.imr_multiaddr.s_addr;
}
in_addr 结构定义为:

struct in_addr{
  ulong s_addr;
}

为了发送到多点广播组,不需要加入这些组。 要接收发送到多点广播组的传输,需要成员资格。 对于多点广播发送,请将 IP_MULTICAST_IF 标志与 setsockopt 子例程配合使用。 这指定要使用的接口。 可能需要使用 IP_MULTICAST_LOOP 标志调用 setsockopt 子例程以控制多点广播包的回送。 缺省情况下,将包传递到包括发送方在内的多点广播组的所有成员 (如果是成员)。 但是,可以使用 setsockopt 子例程使用 IP_MULTICAST_LOOP 标志来禁用此功能。

多点广播通信所需的 setsockopt 子例程标志以及与 IPPROTO_IP 协议级别配合使用的子例程标志如下所示:
描述
IP_ADD_成员资格 连接类型为 struct ip_mreqOptionValue 参数中指定的多点广播组。
IP_DROP_成员资格 保留类型为 struct ip_mreqOptionValue 参数中指定的多点广播组。
IP_MULTICAST_IF 允许在接口上发送多点广播消息,如类型为 struct ip_addrOptionValue 参数中所指定。 INADDR_ANY (0x000000000) 的地址将除去多点广播选项中先前选择的接口。 如果未指定接口,那么将使用指向缺省路由的接口。
IP_MULTICAST_LOOP 设置多点广播回送,确定是否将传输的消息传递到发送主机。 类型为 charOptionValue 参数用于控制开启或关闭回送。
IP_MULTICAST_TTL 设置多点广播包的生存时间 (TTL)。 类型为 charOptionValue 参数用于将此值设置在 0 到 255 之间。

从 AIX® 6.1开始,支持因特网组管理协议 (IGMPv3)。 IGMPv3 允许主机过滤源地址。 可以阻止从特定源地址到特定多点广播组的包传输,或者通过使用带有以下标志的 setsockopt 子例程,允许从特定源地址到特定多点广播组的包传输:

描述
IP_BLOCK_SOURCE 将数据从给定的源地址阻塞到给定的组。 将 ip_mreq_source 结构与此标志配合使用。
IP_UNBLOCK_SOURCE 取消阻塞源。 将 ip_mreq_source 结构与此标志配合使用。
IP_ADD_SOURCE_成员资格 连接具有特定源地址的多点广播组。 如果已不是该组的成员,那么此子例程将加入多点广播组并接受来自给定源地址的数据。 如果已经是多点广播组的成员,那么此子例程也接受来自此源地址的数据。 将 ip_mreq_source 结构与此标志配合使用。
IP_DROP_SOURCE_成员资格 保留具有特定源地址的多点广播组。 此子例程从给定多点广播组列表中删除源地址。 使用 IP_DROP_MEMBERSHIP 子例程来删除组的所有源地址。 将 ip_mreq_source 结构与此标志配合使用。
ip_mreq_source 结构类似于 ip_mrep 结构,但包含附加的 imr_sourceaddr 变量以通过 setsockopt 系统调用传递源过滤的源地址。 ip_mreq_source 结构定义如下:

struct ip_mreq_source {
       struct in_addr  imr_multiaddr;  /* IP multicast address of group */
       struct in_addr  imr_sourceaddr; /* IP address of source */
       struct in_addr  imr_interface;  /* local IP address of interface */
}

以下示例演示在协议级别设置为 Internet Protocol (IPPROTO_IP) 的情况下使用 setsockopt 函数。

要标记要发送到特定接口上的多点广播组的套接字:


struct ip_mreq imr;
setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, &imr.imr_interface.s_addr, sizeof(struct in_addr));
要禁用套接字上的回送:

char loop = 0;
setsockopt(s, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(char));
要允许地址复用以将多个多点广播应用程序绑定到同一 IP 组地址:

int on = 1;
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(int));
要加入多点广播组以进行接收,请执行以下操作:

struct ip_mreq imr;
setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imr, sizeof(struct ip_mreq));
要离开多点广播组:

struct ip_mreq imr;
setsockopt(s, IPPROTO_IP, IP_DROP_MEMBERSHIP, &imr, sizeof(struct ip_mreq));

getsockopt 函数还可以与多点广播标志配合使用,以获取有关特定套接字的信息。

描述
IP_MULTICAST_IF 检索接口的 IP 地址。
IP_MULTICAST_LOOP 从多点广播选项检索指定的循环方式。
IP_MULTICAST_TTL 检索多点广播选项中的生存时间。