11.3.3 多播的编程

11.3.3  多播的编程

多播的程序设计使用setsockopt()函数和getsockopt()函数来实现,组播的选项是IP层的,其选项值和含义参见11.5所示。

11.5  多播相关的选项

getsockopt()/setsockopt()的选项

   

IP_MULTICAST_TTL

设置多播组数据的TTL

IP_ADD_MEMBERSHIP

在指定接口上加入组播组

IP_DROP_MEMBERSHIP

退出组播组

IP_MULTICAST_IF

获取默认接口或设置接口

IP_MULTICAST_LOOP

禁止组播数据回送

1.选项IP_MULTICASE_TTL

选项IP_MULTICAST_TTL允许设置超时TTL,范围为0255之间的任何值,例如:

 

unsigned char ttl=255;

setsockopt(s,IPPROTO_IP,IP_MULTICAST_TTL,&ttl,sizeof(ttl));

2.选项IP_MULTICAST_IF

选项IP_MULTICAST_IF用于设置组播的默认默认网络接口,会从给定的网络接口发送,另一个网络接口会忽略此数据。例如:

 

struct in_addr addr;

setsockopt(s,IPPROTO_IP,IP_MULTICAST_IF,&addr,sizeof(addr));

 

参数addr是希望多播输出接口的IP地址,使用INADDR_ANY地址回送到默认接口。

默认情况下,当本机发送组播数据到某个网络接口时,在IP层,数据会回送到本地的回环接口,选项IP_MULTICAST_LOOP用于控制数据是否回送到本地的回环接口。例如:

 

unsigned char loop;

setsockopt(s,IPPROTO_IP,IP_MULTICAST_LOOP,&loop,sizeof(loop));

 

参数loop设置为0禁止回送,设置为1允许回送。

3.选项IP_ADD_MEMBERSHIPIP_DROP_MEMBERSHIP

加入或者退出一个组播组,通过选项IP_ADD_MEMBERSHIPIP_DROP_MEMBER- SHIP,对一个结构struct ip_mreq类型的变量进行控制,struct ip_mreq原型如下:

 

struct ip_mreq          

{

      struct in_addr imn_multiaddr;      /*加入或者退出的广播组IP地址*/

      struct in_addr imr_interface;      /*加入或者退出的网络接口IP地址*/

};

 

选项IP_ADD_MEMBERSHIP用于加入某个广播组,之后就可以向这个广播组发送数据或者从广播组接收数据。此选项的值为mreq结构,成员imn_multiaddr是需要加入的广播组IP地址,成员imr_interface是本机需要加入广播组的网络接口IP地址。例如:

 

struct ip_mreq mreq;

setsockopt(s,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));

 

使用IP_ADD_MEMBERSHIP选项每次只能加入一个网络接口的IP地址到多播组,但并不是一个多播组仅允许一个主机IP地址加入,可以多次调用IP_ADD_MEMBERSHIP选项来实现多个IP地址加入同一个广播组,或者同一个IP地址加入多个广播组。当imr_ interfaceINADDR_ANY时,选择的是默认组播接口。

4.选项IP_DROP_MEMBERSHIP

选项IP_DROP_MEMBERSHIP用于从一个广播组中退出。例如:

 

struct ip_mreq mreq;

setsockopt(s,IPPROTP_IP,IP_DROP_MEMBERSHIP,&mreq,sizeof(sreq));

 

其中mreq包含了在IP_ADD_MEMBERSHIP中相同的值。

5.多播程序设计的框架

要进行多播的编程,需要遵从一定的编程框架,其基本顺序如图11.6所示。

多播程序框架主要包含套接字初始化、设置多播超时时间、加入多播组、发送数据、接收数据以及从多播组中离开几个方面。其步骤如下:

1)建立一个socket

2)然后设置多播的参数,例如超时时间TTL、本地回环许可LOOP等。

3)加入多播组。

4)发送和接收数据。

5)从多播组离开。

图11.6多播的编程流程

你可能感兴趣的:(编程,框架,struct,网络,socket,interface)