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方法(分配空间)
先说这个而不是构造函数,是因为这个方法是一个关键方法。构造函数也要用到它。
assign
为fData
成员动态分配内存空间和拷贝数据。通过参数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 }