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

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

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

    • 简介
    • 1) NetAddress网络地址类简述
    • 下面是其定义
    • assign方法(分配空间)
    • NetAddress的构造
    • clean方法(清理)与析构
    • operate= 重载赋值操作

本文由乌合之众 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;

定义在文件live555sourcecontrol\groupsock\include\NetAddress.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 }
时间: 2024-10-04 01:44:27

28 GroupSock(NetAddress)——live555源码阅读(四)网络的相关文章

29 GroupSock(NetAddressList)——live555源码阅读(四)网络

29 GroupSock(NetAddressList)——live555源码阅读(四)网络 29 GroupSock(NetAddressList)——live555源码阅读(四)网络 简介 NetAddressList的定义 assign方法 NetAddressList的构造 clean方法与析构 拷贝构造与赋值运算符重载 NetAddressList::Iterator迭代器 本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso 本文由乌合之众 lym瞎

30 GroupSock(Port)——live555源码阅读(四)网络

30 GroupSock(Port)——live555源码阅读(四)网络 30 GroupSock(Port)——live555源码阅读(四)网络 简介 Port类的定义 Port的构造与全局的 << 运算符重载 本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso 本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso 简介 端口类是用于保存网络端口的,计算机网络端口一般有两种含义,分别是物理意义上的网络设备接口和逻辑意义上的端口

27 GroupSock概述(一)——live555源码阅读(四)网络

27 GroupSock概述(一)——live555源码阅读(四)网络 27 GroupSock概述(一)——live555源码阅读(四)网络 简介 1.网络通用数据类型定义 2.Tunnel隧道封装 本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso 本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso 简介 group是组/群的意思,socket是网络接口的代名词了.这个部分很庞大,主要是与网络相关的.而live555的网络模

39 网络相关函数(七)——live555源码阅读(四)网络

39 网络相关函数(七)——live555源码阅读(四)网络 39 网络相关函数(七)——live555源码阅读(四)网络 简介 14)readSocket从套接口读取数据 recv/recvfrom 函数 函数原型: 参数说明: 返回说明: 本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso 本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso 简介 网络相关函数是一系列用于操作网络数据的函数.在多个文件中都有相关的函数的定义.

38 网络相关函数(六)——live555源码阅读(四)网络

38 网络相关函数(六)——live555源码阅读(四)网络 38 网络相关函数(六)——live555源码阅读(四)网络 简介 12)makeSocketNonBlocking和makeSocketBlocking套接口阻塞属性设置 13)setupStreamSocket设置流式套接口 本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso 本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso 简介 网络相关函数是一系列用于操作网

SDWebImage源码阅读(四)SDWebImageDecoder

一般我们都是使用: 1 + (nullable UIImage *)imageNamed:(NSString *)name; // load from main bundle 和: 1 + (nullable UIImage *)imageWithContentsOfFile:(NSString *)path; 两种方式加载图片,它们两个的区别在SDWebImage源码阅读前的准备(三)UIImage.h 里面的 "(六):加载和创建UIImage 的类方法和实例方法:"部分有详细的介

Spring源码阅读四 IOC

前面讲了 简单的实现方式通过FileSystemXmlApplicationContext这个类来实现,那么今天看下这个类做了什么,是如何完成IOC的? 上代码: public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) throws BeansException { super(parent); setConfigLocations(c

Struts2源码阅读(一)_Struts2框架流程概述

1. Struts2架构图  当外部的httpservletrequest到来时 ,初始到了servlet容器(所以虽然Servlet和Action是解耦合的,但是Action依旧能够通过httpservletrequest取得请求参数), 然后通过Filter chain,Filter主要包括ActionContextCleanUp,它主要清理当前线程的ActionContext和 Dispatcher:FilterDispatcher主要通过AcionMapper来决定需要调用哪个Actio

【原】AFNetworking源码阅读(四)

[原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDelegate类所实现的NSURLSession相关的代理方法,甚至连dataTask.uploadTask.downloadTask这几个基本概念也没说.这一篇就是为了集中消灭这些遗留问题. 2. AFURLSessionManagerTaskDelegate的代理方法 此处实现的仍然是NSURLS