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

    28 GroupSock(NetAddress)——live555源码阅读(四)网络

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

    简介

    使用Socket进行的网络连接,网络地址一般由地址(IP)和端口(port)组成。
    live555中定义了一些数据类型,表明了目前所支持的网络地址类型。

    1 // Definition of a type representing a low-level network address.
    2 // At present, this is 32-bits, for IPv4.  Later, generalize it,
    3 // to allow for IPv6.
    4 // 一种代表底层网络地址定义。目前,默认它32位,IPv4。将来,可扩展支持IPv6。
    5 typedef u_int32_t netAddressBits;
    6 typedef u_int16_t portNumBits;

    定义在文件live555sourcecontrolgroupsockincludeNetAddress.hh

    1) NetAddress网络地址类简述

    NetAddress是一个用于保存网络地址的类,它不是对struct sockaddr的封装。其内部定义了两个数据成员,分别是用于保存地址数据的u_int8_t* fData和用于指示地址长度的unsigned fLength

    下面是其定义

     1 class NetAddress {
     2     public:
     3     NetAddress(u_int8_t const* data,
     4            unsigned length = 4 /* default: 32 bits IPv4*/);
     5     NetAddress(unsigned length = 4); // sets address data to all-zeros
     6     NetAddress(NetAddress const& orig);
     7     NetAddress& operator=(NetAddress const& rightSide);
     8     virtual ~NetAddress();
     9 
    10     unsigned length() const { return fLength; }
    11     u_int8_t const* data() const // always in network byte order
    12         { return fData; }
    13 
    14     private:
    15     void assign(u_int8_t const* data, unsigned length);
    16     void clean();
    17 
    18     unsigned fLength;
    19     u_int8_t* fData;
    20 };
    NetAddress 的定义

    assign方法(分配空间)

    先说这个而不是构造函数,是因为这个方法是一个关键方法。构造函数也要用到它。
    assignfData成员动态分配内存空间和拷贝数据。通过参数length来确定分配空间的大小,而参数data用于作为数据源拷贝到申请的新空间。要注意的是这个方法的权限是private的,所以没有检查data==NULL也是可以的。
    这里提一个C++的有意思的地方,就是new分配失败不是返回NULL,而是抛出异常(std::bad_alloc e)。除非是重载的new或者使用无抛出的new (std::nothrow)。但是早期一些C++编译器的实现可能是new与malloc行为一致,都是返回NULL。

     1 //为fDate申请length字节内存空间,并将data指向内容拷贝到新空间
     2 void NetAddress::assign(u_int8_t const* data, unsigned length) {
     3   fData = new u_int8_t[length];
     4   if (fData == NULL) {
     5     fLength = 0;
     6     return;
     7   }
     8 
     9   for (unsigned i = 0; i < length; ++i) fData[i] = data[i];
    10   fLength = length;
    11 }

    NetAddress的构造

    NetAddress定义了三个构造函数,两个普通的带参构造和一个拷贝构造(拷贝构造也是带参构造的一种)。
    三个构造函数一致的特点就是都为fData成员动态申请了内存空间。代码很简单,不详述了。

     1 //构造函数,为fDate申请length字节内存空间,并将data指向内容拷贝到新空间
     2 NetAddress::NetAddress(u_int8_t const* data, unsigned length) {
     3   assign(data, length);
     4 }
     5 //为fDate申请length字节内存空间,并将新空间清零
     6 NetAddress::NetAddress(unsigned length) {
     7   fData = new u_int8_t[length];
     8   if (fData == NULL) {
     9     fLength = 0;
    10     return;
    11   }
    12 
    13   for (unsigned i = 0; i < length; ++i) fData[i] = 0;
    14   fLength = length;
    15 }
    16 
    17 //拷贝构造
    18 NetAddress::NetAddress(NetAddress const& orig) {
    19   assign(orig.data(), orig.length());
    20 }
    构造函数

    clean方法(清理)与析构

    clean方法用于将fData指向的内存空间进行释放。就是将NetAddress对象保存的数据给清理掉了,注意这个方法是private权限。

    题外话:clean和clear的意思还是有一点区别的。

    1 //清除地址数据
    2 void NetAddress::clean() {
    3   delete[] fData; fData = NULL;
    4   fLength = 0;
    5 }

    析构就是对clean的调用。

    1 //析构
    2 NetAddress::~NetAddress() {
    3   clean();
    4 }

    operate= 重载赋值操作

    这个很简单,不详述了。

    1 //重载 = 赋值
    2 NetAddress& NetAddress::operator=(NetAddress const& rightSide) {
    3   if (&rightSide != this) {
    4     clean();
    5     assign(rightSide.data(), rightSide.length());
    6   }
    7   return *this;
    8 }
  • 相关阅读:
    Contiki学习笔记  第一个程序:Hello World
    contiki学习笔记---process结构体
    MYSQL碰到The total number of locks exceeds the lock table size 问题解决记录
    navicat连接mysql查询结果中文都是?号(C#)
    C#使用OracleBulkCopy
    解决IIS应用程序池默认回收导致程序崩溃
    构建可读性更高的 ASP.NET Core 路由机制
    .Net(C#)汉字和Unicode编码互相转换
    聊聊c#字符串拼接
    VS2010到VS2019各个版本的密钥
  • 原文地址:https://www.cnblogs.com/oloroso/p/4613341.html
Copyright © 2011-2022 走看看