zoukankan      html  css  js  c++  java
  • 单播、广播、组播(多播)

    多播广播是用于建立分步式系统:例如网络游戏、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);

    }

  • 相关阅读:
    Redis 之 数据持久化、主从复制、哨兵、集群
    Linux 之 MySQL(mariadb) 主从复制
    python 面试题
    Linux 之 nginx相关
    Linux 之redis 的安装及使用
    Linux 之 安装虚拟环境virtualenvwrapper
    Vue使用Element-ui走马灯功能动态改变图片和容器大小
    文本信息抽取的方法
    python3 将文本用utf-8编码方式写入txt文件
    一个比celery更简单的python异步模块rq
  • 原文地址:https://www.cnblogs.com/meihao1203/p/8661640.html
Copyright © 2011-2022 走看看