正在加载……
专注、离线、切勿分心

多播广播是用于建立分步式系统:例如网络游戏、ICQ聊天构建、远程视频会议系统的重要工具。使用多播广播的程序和UDP的单播程序相似。区别在于多播广播程序使用特殊的IP地址。

对于单播而言,单播用于两个主机之间的端对端通信。

对于广播而言,广播用于一个主机对整个局域网上所有主机上的数据通信。广播只能用于客户机向服务器广播,因为客户机要指明广播的IP地址“192.168.0.255”和广播的端口号。服务器端bind的时候,绑定的端口号要跟广播的端口号是同一个。这样才能收到广播消息。实例请参考《udp_广播》。

       对于多播而言,也称为组播,将网络中同一业务类型主机进行了逻辑上的分组,进行数据收发的时候其数据仅仅在同一分组中进行,其他的主机没有加入此分组不能收发对应的数据。单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信。实际情况下,经常需要对一组特定的主机进行通信,而不是整个局域网上的所有主机,这就是多播的用途。例如,我们通常所说的讨论组。IPv4多播地址采用DIP地址确定多播的组(所有IP都可以)。在Internet中,多播地址范围是从224.0.0.0234.255.255.255

多播的程序设计也要使用setsockopt()函数和getsockopt()函数来实现。其中对于setsockopt的第二个参数level不再是SOL_SOCKET,而是IPPROTO_IP;而且第三个参数optname常见的选项有:

Optname 含义
IP_ADD_MEMBERSHIP 在指定接口上加入组播组
IP_DROP_MEMBERSHIP 退出组播组

选项IP_ADD_MEMBERSHIPIP_DROP_MEMBERSHIP加入或者退出一个组播组,通过选项IP_ADD_MEMBERSHIPIP_DROP_MEMBERSHIP,对一个结构struct ip_mreq类型的变量进行控制。

struct ip_mreq原型如下:
struct ip_mreq
{
    struct in_addr    imr_multiaddr;     /*加入或者退出的多播组IP地址*/
    struct in_addr    imr_interface;     /*加入或者退出的网络接口IP地址,本机IP*/
};


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

struct ip_mreq mreq;

memset(&mreq, 0, sizeof(struct ip_mreq));

mreq.imr_interface.s_addr = INADDR_ANY;

mreq.imr_multiaddr.s_addr = inet_addr("224.1.1.1");

if(-1 == setsockopt(sfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(struct ip_mreq)))

{

       perror("setsockopt");

       exit(-1);

}

接下来再绑定组播的port号(如65000),就可以接收组播消息了。实例请参考《udp_多播》

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

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

if(-1 == setsockopt(sfd,IPPROTP_IP,IP_DROP_MEMBERSHIP,&mreq,sizeof(struct ip_mreq)))

{

       perror("setsockopt");

       exit(-1);

}

posted on 2018-03-28 08:45  正在加载……  阅读(414)  评论(0编辑  收藏  举报