28 GroupSock(NetAddress)——live555源码阅读(四)网络
28 GroupSock(NetAddress)——live555源码阅读(四)网络
本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso
本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso
简介
使用Socket进行的网络连接,网络地址一般由地址(IP)和端口(port)组成。
live555中定义了一些数据类型,表明了目前所支持的网络地址类型。
// Definition of a type representing a low-level network address.
// At present, this is 32-bits, for IPv4. Later, generalize it,
// to allow for IPv6.
// 一种代表底层网络地址定义。目前,默认它32位,IPv4。将来,可扩展支持IPv6。
typedef u_int32_t netAddressBits;
typedef u_int16_t portNumBits;
定义在文件live555sourcecontrol\groupsock\include\NetAddress.hh
1) NetAddress网络地址类简述
NetAddress是一个用于保存网络地址的类,它不是对struct sockaddr的封装。其内部定义了两个数据成员,分别是用于保存地址数据的u_int8_t* fData和用于指示地址长度的unsigned fLength。

下面是其定义
class NetAddress {
public:
NetAddress(u_int8_t const* data,
unsigned length = /* default: 32 bits IPv4*/);
NetAddress(unsigned length = ); // sets address data to all-zeros
NetAddress(NetAddress const& orig);
NetAddress& operator=(NetAddress const& rightSide);
virtual ~NetAddress();
unsigned length() const { return fLength; }
u_int8_t const* data() const // always in network byte order
{ return fData; }
private:
void assign(u_int8_t const* data, unsigned length);
void clean();
unsigned fLength;
u_int8_t* fData;
};
NetAddress 的定义
assign方法(分配空间)
先说这个而不是构造函数,是因为这个方法是一个关键方法。构造函数也要用到它。
assign为fData成员动态分配内存空间和拷贝数据。通过参数length来确定分配空间的大小,而参数data用于作为数据源拷贝到申请的新空间。要注意的是这个方法的权限是private的,所以没有检查data==NULL也是可以的。
这里提一个C++的有意思的地方,就是new分配失败不是返回NULL,而是抛出异常(std::bad_alloc e)。除非是重载的new或者使用无抛出的new (std::nothrow)。但是早期一些C++编译器的实现可能是new与malloc行为一致,都是返回NULL。
//为fDate申请length字节内存空间,并将data指向内容拷贝到新空间
void NetAddress::assign(u_int8_t const* data, unsigned length) {
fData = new u_int8_t[length];
if (fData == NULL) {
fLength = ;
return;
} for (unsigned i = ; i < length; ++i) fData[i] = data[i];
fLength = length;
}
NetAddress的构造
NetAddress定义了三个构造函数,两个普通的带参构造和一个拷贝构造(拷贝构造也是带参构造的一种)。
三个构造函数一致的特点就是都为fData成员动态申请了内存空间。代码很简单,不详述了。
//构造函数,为fDate申请length字节内存空间,并将data指向内容拷贝到新空间
NetAddress::NetAddress(u_int8_t const* data, unsigned length) {
assign(data, length);
}
//为fDate申请length字节内存空间,并将新空间清零
NetAddress::NetAddress(unsigned length) {
fData = new u_int8_t[length];
if (fData == NULL) {
fLength = ;
return;
} for (unsigned i = ; i < length; ++i) fData[i] = ;
fLength = length;
} //拷贝构造
NetAddress::NetAddress(NetAddress const& orig) {
assign(orig.data(), orig.length());
}
构造函数
clean方法(清理)与析构
clean方法用于将fData指向的内存空间进行释放。就是将NetAddress对象保存的数据给清理掉了,注意这个方法是private权限。
题外话:clean和clear的意思还是有一点区别的。
//清除地址数据
void NetAddress::clean() {
delete[] fData; fData = NULL;
fLength = ;
}
析构就是对clean的调用。
//析构
NetAddress::~NetAddress() {
clean();
}
operate= 重载赋值操作
这个很简单,不详述了。
//重载 = 赋值
NetAddress& NetAddress::operator=(NetAddress const& rightSide) {
if (&rightSide != this) {
clean();
assign(rightSide.data(), rightSide.length());
}
return *this;
}
28 GroupSock(NetAddress)——live555源码阅读(四)网络的更多相关文章
- 29 GroupSock(NetAddressList)——live555源码阅读(四)网络
29 GroupSock(NetAddressList)——live555源码阅读(四)网络 29 GroupSock(NetAddressList)——live555源码阅读(四)网络 简介 Net ...
- 32 GroupSock(AddressPortLookupTable)——live555源码阅读(四)网络
32 GroupSock(AddressPortLookupTable)——live555源码阅读(四)网络 32 GroupSock(AddressPortLookupTable)——live555 ...
- 31 GroupSock(AddressString)——live555源码阅读(四)网络
31 GroupSock(AddressString)——live555源码阅读(四)网络 31 GroupSock(AddressString)——live555源码阅读(四)网络 简介 Addre ...
- 30 GroupSock(Port)——live555源码阅读(四)网络
30 GroupSock(Port)——live555源码阅读(四)网络 30 GroupSock(Port)——live555源码阅读(四)网络 简介 Port类的定义 Port的构造与全局的 &l ...
- 27 GroupSock概述(一)——live555源码阅读(四)网络
27 GroupSock概述(一)——live555源码阅读(四)网络 27 GroupSock概述(一)——live555源码阅读(四)网络 简介 1.网络通用数据类型定义 2.Tunnel隧道封装 ...
- 33 网络相关函数(一)——live555源码阅读(四)网络
33 网络相关函数(一)——live555源码阅读(四)网络 33 网络相关函数(一)——live555源码阅读(四)网络 简介 1)IsMulticastAddress多播(组播)地址判断函数 多播 ...
- 40 网络相关函数(八)——live555源码阅读(四)网络
40 网络相关函数(八)——live555源码阅读(四)网络 40 网络相关函数(八)——live555源码阅读(四)网络 简介 15)writeSocket向套接口写数据 TTL的概念 函数send ...
- 39 网络相关函数(七)——live555源码阅读(四)网络
39 网络相关函数(七)——live555源码阅读(四)网络 39 网络相关函数(七)——live555源码阅读(四)网络 简介 14)readSocket从套接口读取数据 recv/recvfrom ...
- 38 网络相关函数(六)——live555源码阅读(四)网络
38 网络相关函数(六)——live555源码阅读(四)网络 38 网络相关函数(六)——live555源码阅读(四)网络 简介 12)makeSocketNonBlocking和makeSocket ...
随机推荐
- JavaScript的闭包原理
什么是js(JavaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 个人的理解是 ...
- Java Connection.setAutoCommit
Java setAutoCommit 默认为true,即每条SQL语句在各自的一个事务中执行. 很多时候需要有多个操作在一个事务执行,如循环插入,此时可在插入开始前设置 conn.setAutoCom ...
- pulltorefresh滚动到底部
如果用ListView,让它滚动到顶部,一般是这样写的: if (!listView.isStackFromBottom()) { listView.setStackFromBottom(true); ...
- ecshop 调用收货地址
html {insert_scripts files='region.js,utils.js'} <script type="text/javascript"> reg ...
- jquermobile 安装
代码 <script src="../Public/js/jquery-1.11.1.min.js"></script> <script src=&q ...
- Yii2 行为
// Step 1: 定义一个将绑定行为的类 class MyClass extends yii\base\Component { // 空的 } // Step 2: 定义一个行为类,他将绑定到My ...
- 用apache-cxf生成webservice客户端的时候报错Parameter: shead already exists for method
版本apache-cxf-3.1.0 命令如下:wsdl2java -p com.wz.interfaces -d ./src -client ./ws/xxx.wsdl 报错如下: WSDLToJa ...
- ZooKeepr日志清理【转】
转自 :@ni掌柜nileader@gmail.com 地址 数据文件管理 默认情况下,ZK的数据文件和事务日志是保存在同一个目录中,建议是将事务日志存储到单独的磁盘上. 1 数据目录 ZK的数据目录 ...
- 解决DWZ(JUI)的panel 点击关闭或者打开按钮 自己写的标签消失
问题描述:DWZ的panel面板比较常用,我们常常需要在其标题栏上再增加一个些按钮,如下图问题出来了,增加按钮后,点面板收缩按钮,增加的按钮就消失了而且面板收缩的click事件,也跟新增的按钮绑定了, ...
- Web API 身份验证 不记名令牌验证 Bearer Token Authentication
1. Startup.Auth.cs文件 添加属性 public static OAuthBearerAuthenticationOptions OAuthBearerOptions { get; p ...