IP组播技术综述
www. 日期:2005-8-10 浏览次数:58267
出处:bbs. 五、组播应用与编程
对于套接字编程,首先要使用函数socket()建立一个数据包套接字,然后用bind()函数将套接字与一个地址和端口号连接起来。 为了发送一个组播数据包,需要在sendto()调用中指定一个组播地址作为目的地址(所有IP地址都使用网络字节顺序)。 为了接收一个组播数据包,需要在recvfrom()调用中指定所要接收的组播地址。 IP_MULTICAST_TTL允许将随后的组播数据的TTL设定成从0到255之间的任何值,例如: u_char ttl; setsockopt(sock,IPPROTO_IP,IP_MULTICAST_TTL,&ttl,sizeof(ttl)); 关于TTL的讨论见上文。 通过IP_MULTICAST_IF,系统管理员可在安装的时候为组播创建默认的接口(为从一个给定的网络接口并发传送,一个网络接口会忽略这个默认值)。例如: struct in_addr addr; setsockopt(sock,IPPROTO_IP,IP_MULTICAST_IF,&addr,sizeof(addr)); 在这里,addr是希望输出接口的本地IP地址,可使用一个INADDR_ANY地址来回送到默认的接口。 当组播组中的一台主机发送组播数据到输出接口时,默认的IP层将为本地回送数据的拷贝。 IP_MULTICAST_LOOP网络参数控制IP层是否回送所送的数据。例如: u_char loop; setsockopt(sock,IPPROTO_IP,IP_MULTICAST_LOOP,&loop,sizeof(loop)); 将loop设置为0则禁止回送,设置为1则允许回送。 为了能够接收IP组播数据,主机必须加入某个或多个组播组,程序通过使用IP_ADD_MEMBERSHIP网络接口参数向主机提出加入组播组的申请。例如: struct ip_mreq {struct in_addr imn_multiaddr; /* multicast group to join */ struct in_addr imr_interface; /* interface to join on */ }mreq; setsockopt(sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)); 一个组的成员是与一个单一的网络接口相联系;主机可在不止一个网络接口上加入相同的组。若选择默认组播接口,要将imr_interface设置为INADDR_ANY;若选择主机其中一个本地地址,要将imr_interface设置为特定的组播接口。 若撤消一个成员资格,使用IP_DROP_MEMBERSHIP struct ip_mreq mreq; setsockopt(sock,IPPROTP_IP,IP_DROP_MEMBERSHIP,&mreq,sizeof(sreq)); 其中mreq包含了在IP_ADD_MEMBERSHIP命令中相同的值。 5.2.2 Windows Socket组播API 基于Winsock1.1的组播编程与Berkeley Socket类似,这里不再赘述。Winsock2是Winsock1.1的扩展,除兼容Berkeley Sockets组播API外,它还定义了一套支持IP组播的协议独立API,如表4所示: 表4 WinSock 2的协议独立组播API说明
在Winsock2中,定义了“数据平面”(Data Plane)和“控制平面”(Control Plane)的概念,其中,数据平面决定在不同的网络成员之间数据如何传送;控制平面定义网络成员的组织方式; 这两方面的特征既可以是“有根的”(Rooted),也可以是“无根的”(Nonrooted)。在“有根的”控制平面内,存在一个特殊的组播组成员,称作C_root(根节点),其余的组成员称作C_leaf(叶节点)。对“无根的”控制平面而言,只存在叶节点。 在“有根的”平面中,根节点负责组播的建立,以及同任意数量叶节点的连接。叶节点可申请加入一个特定的组播组。数据传送只能在根节点和叶节点之间进行,根节点将数据组播到每个叶节点。 在“无根的”平面中,只存在叶节点,它们可以任意加入一个组播组。从叶节点发送的数据会组播到每一个叶节点。 由于篇幅所限,有关Winsock API的进一步讨论,请参阅参考文献<3>、<5>和MSDN。 |
|