zoukankan      html  css  js  c++  java
  • 33 网络相关函数(一)——live555源码阅读(四)网络

    33 网络相关函数(一)——live555源码阅读(四)网络

    本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso
    本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso

    简介

    网络相关函数是一系列用于操作网络数据的函数。在多个文件中都有相关的函数的定义。还有一些函数是系统socket API相关函数,就不提了。
       这一系列的函数大多有一个特点,需要一个UsageEnvironmet&型的参数。
       这些方法大多在live555sourcecontrolgroupsockincludeGroupsockHelper.hh中声明。

    1)IsMulticastAddress多播(组播)地址判断函数

    IsMulticastAddress用于判断一个地址是否为多播(组播)地址,如果是的话返回true,否则返回false

    声明在文件live555sourcecontrolgroupsockincludeNetAddress.hh
       有些应用会有这样的要求:一些分布在各处的进程需要以组的方式协同工作,组中的进程通常要给其他所有的成员发送消息。即有这样的一种方法能够给一些明确定义的组发送消息,这些组的成员数量虽然很多,但是与整个网络规模相比却很小。给这样一个组发送消息称为多点点播送,简称多播。

    / 判断参数释放是一个多播地址
    Boolean IsMulticastAddress(netAddressBits address) {
        // Note: We return False for addresses in the range 224.0.0.0
        // through 224.0.0.255, because these are non-routable
        // 注意:我们在224.0.0.0到224.0.0.255范围地址返回false,因为这些是不可路由的 
        // Note: IPv4-specific #####
        // 注:支持IPv4特定#####
        netAddressBits addressInNetworkOrder = htonl(address);
        return addressInNetworkOrder > 0xE00000FF &&
            addressInNetworkOrder <= 0xEFFFFFFF;
    }
    

    多播简要说明

    IP多播(也称多址广播或组播)技术,是一种允许一台或多台主机(多播源)发送单一数据包到多台主机(一次的,同时的)的TCP/IP网络技术。多播作为一点对多点的通信,是节省网络带宽的有效方法之一。在网络音频/视频广播的应用中,当需要将一个节点的信号传送到多个节点时,无论是采用重复点对点通信方式,还是采用广播方式,都会严重浪费网络带宽,只有多播才是最好的选择。多播能使一个或多个多播源只把数据包发送给特定的多播组,而只有加入该多播组的主机才能接收到数据包。目前,IP多播技术被广泛应用在网络音频/视频广播、AOD/VOD、网络视频会议、多媒体远程教育、“push”技术(如股票行情等)和虚拟现实游戏等方面。
    IP多播通信必须依赖于IP多播地址,在IPv4中它是一个D类IP地址,范围从224.0.0.0239.255.255.255,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类。其中,局部链接多播地址范围在224.0.0.0~224.0.0.255,这是为路由协议和其它用途保留的地址,路由器并不转发属于此范围的IP包;预留多播地址为224.0.1.0~238.255.255.255,可用于全球范围(如Internet)或网络协议;管理权限多播地址为239.0.0.0~239.255.255.255,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。
       使用同一个IP多播地址接收多播数据包的所有主机构成了一个主机组,也称为多播组。一个多播组的成员是随时变动的,一台主机可以随时加入或离开多播组,多播组成员的数目和所在的地理位置也不受限制,一台主机也可以属于几个多播组。此外,不属于某一个多播组的主机也可以向该多播组发送数据包。

    多播编程简述

    1.流程

    1>建立一个socket;
       2>设置多播的参数,例如超时时间TTL,本地回环许可LOOP
       3>加入多播组
       4>发送和接收数据
       5>从多播组离开

    2.多播程序设计使用setsockopt()函数和getsockopt()函数来实现,组播的选项是IP层的。

    3.setsockopt()的选项

    1>IP_MULTICAST_TTL:设置多播组数据的TTL值(路由跳数),每跨过一个路由器,TTL值减一.范围为0~255之间的任何值。

    int  ttl;
    setsockopt(sock_fd,IPPROTO_IP,IP_MULTICAST_TTL,&ttl,sizeof(ttl));
    

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

    int  loop;
    setsockopt(sock_fd,IPPROTO_IP,IP_MULTICAST_LOOP,&loop,sizeof(loop));
    

    参数loop设置为0表示禁止回送,设置为1允许回送。
    3>IP_ADD_MEMBERSHIP: 该选项通过对一个结构struct ip_mreq类型的变量进行控制而加入一个多播组。

    struct ip_mreq
    {
           struct in_addr imr_multiaddr;/*加入的多播组IP地址*/
           struct  in_addr imr_interface;/*加入的网络接口IP地址*/
    };
    

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

    struct ip_mreq  mreq;
    setsockopt(sock_fd,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:该选项用于从一个多播组中退出。

    struct ip_mreq  mreq;
    setsockopt(sock_fd,IPPROTP_IP,IP_DROP_MEMBERSHIP,&merq,sizeof(sreq));
    

    实例:

    • 情景:
    • 服务器端每隔2秒向目的端口号为5000和目的多播地址为224.0.0.255发送数据welcome you to multicast socket programme。
    • 客户端从多播地址为224.0.0.255和端口号5000处接收5次多播数据。

  • 相关阅读:
    Authentication for the REST APIs
    Authentication for the REST APIs
    泛型转Datatable
    Web API 返回json文件的2中不用方式
    Robotframework自定义关键字库
    python通过接口上传图片造测试数据
    robot framework(2) 环境搭建
    RobotFrameWork(1) 关键字驱动测试框架
    python发送带附件的邮件
    解决adb连接海马玩模拟器
  • 原文地址:https://www.cnblogs.com/oloroso/p/4724021.html
Copyright © 2011-2022 走看看