zoukankan      html  css  js  c++  java
  • 31 GroupSock(AddressString)——live555源码阅读(四)网络

    31 GroupSock(AddressString)——live555源码阅读(四)网络

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

    简介

    AddressString类是用于以点分十进制的C风格字符串形式保存的IP地址,这是为了替换"inet_ntoa()",因为它不是线程安全的。这里就不介绍什么是线程安全了,inet_ntoa内部存在静态变量,在不同的线程中调用可能会导致混乱。
    AddressString类定义了一个数据成员fVal用于动态申请内存来保存数据,注意这个类目前只能用于IPv4的地址保存,对于IPv6还未做支持。

    AddressString类定义

     1 // A mechanism for displaying an IPv4 address in ASCII.  This is intended to replace "inet_ntoa()", which is not thread-safe.
     2 // 一种机制,用于ASCII码显示IPv4地址。这是为了替换"inet_ntoa()",因为这是不是线程安全的。
     3 class AddressString {
     4 public:
     5     AddressString(struct sockaddr_in const& addr);
     6     AddressString(struct in_addr const& addr);
     7     AddressString(netAddressBits addr); // "addr" is assumed to be in host byte order here
     8 
     9     virtual ~AddressString();
    10 
    11     char const* val() const { return fVal; }
    12 
    13 private:
    14     void init(netAddressBits addr); // used to implement each of the constructors
    15 
    16 private:
    17     char* fVal; // The result ASCII string: allocated by the constructor; deleted by the destructor
    18     //其结果是ASCII码字符串:由构造函数分配;在析构函数中删除
    19 };

    AddressString::init方法

    AddressString::init方法是一个private权限方法,是用于实现构造对象的时候初始化的,其只被构造函数调用。
    这里在sprintf之前调用htonl将地址转为网络字节序,是为了方便sprintf的操作。因为一块内存空间的首地址是低地址,网络字节序是大端序,低地址保存高位。这里确保我们有一个准确的字节序。

    void AddressString::init(netAddressBits addr) {
        //针对的是IPv4类型,16byte足够,IPv6需要46Byte
        fVal = new char[16]; // large enough for "abc.def.ghi.jkl"
        //转为网络字节序
        netAddressBits addrNBO = htonl(addr); // make sure we have a value in a known byte order: big endian
        //转为点分十进制表示
        sprintf(fVal, "%u.%u.%u.%u", (addrNBO >> 24) & 0xFF, (addrNBO >> 16) & 0xFF, (addrNBO >> 8) & 0xFF, addrNBO & 0xFF);
        }
    

    AddressString构造与析构

    构造没什么好说的,都是调用的init方法,只需要注意在init中为成员fVal申请了内存空间。

    AddressString::AddressString(struct sockaddr_in const& addr) {
        init(addr.sin_addr.s_addr);
    }
    
    AddressString::AddressString(struct in_addr const& addr) {
        init(addr.s_addr);
    }
    
    AddressString::AddressString(netAddressBits addr) {
        init(addr);
    }
    

    析构的时候释放init方法中申请的内存空间。

    AddressString::~AddressString() {
        delete[] fVal;
    }
    
  • 相关阅读:
    Java 中的POJO和JavaBean 的区别
    设计模式的六大原则
    AOP
    Jetbrains 全家桶
    centos7 如何关闭防护墙
    Java 面试题常见范围
    putty readme
    单机环境
    flask-caching缓存
    1.restful 规范与APIView
  • 原文地址:https://www.cnblogs.com/oloroso/p/4629193.html
Copyright © 2011-2022 走看看