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类定义
// A mechanism for displaying an IPv4 address in ASCII. This is intended to replace "inet_ntoa()", which is not thread-safe.
// 一种机制,用于ASCII码显示IPv4地址。这是为了替换"inet_ntoa()",因为这是不是线程安全的。
class AddressString {
public:
AddressString(struct sockaddr_in const& addr);
AddressString(struct in_addr const& addr);
AddressString(netAddressBits addr); // "addr" is assumed to be in host byte order here virtual ~AddressString(); char const* val() const { return fVal; } private:
void init(netAddressBits addr); // used to implement each of the constructors private:
char* fVal; // The result ASCII string: allocated by the constructor; deleted by the destructor
//其结果是ASCII码字符串:由构造函数分配;在析构函数中删除
};
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;
}
31 GroupSock(AddressString)——live555源码阅读(四)网络的更多相关文章
- 32 GroupSock(AddressPortLookupTable)——live555源码阅读(四)网络
32 GroupSock(AddressPortLookupTable)——live555源码阅读(四)网络 32 GroupSock(AddressPortLookupTable)——live555 ...
- 30 GroupSock(Port)——live555源码阅读(四)网络
30 GroupSock(Port)——live555源码阅读(四)网络 30 GroupSock(Port)——live555源码阅读(四)网络 简介 Port类的定义 Port的构造与全局的 &l ...
- 29 GroupSock(NetAddressList)——live555源码阅读(四)网络
29 GroupSock(NetAddressList)——live555源码阅读(四)网络 29 GroupSock(NetAddressList)——live555源码阅读(四)网络 简介 Net ...
- 28 GroupSock(NetAddress)——live555源码阅读(四)网络
28 GroupSock(NetAddress)——live555源码阅读(四)网络 28 GroupSock(NetAddress)——live555源码阅读(四)网络 简介 1) NetAddre ...
- 27 GroupSock概述(一)——live555源码阅读(四)网络
27 GroupSock概述(一)——live555源码阅读(四)网络 27 GroupSock概述(一)——live555源码阅读(四)网络 简介 1.网络通用数据类型定义 2.Tunnel隧道封装 ...
- 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 ...
- 37 网络相关函数(五)——live555源码阅读(四)网络
37 网络相关函数(五)——live555源码阅读(四)网络 37 网络相关函数(五)——live555源码阅读(四)网络 简介 10)MAKE_SOCKADDR_IN构建sockaddr_in结构体 ...
随机推荐
- js正则匹配浮点数或整数
var pos='point(12.4 -45.423453)';var re = /([+]\d+[.]\d+|[-]\d+[.]\d+|\d+[.]\d+|[+]\d+|[-]\d+|\d+)/i ...
- Random类
Random类是随机数产生类,可以指定一个随机数的范围,然后任意产生在此范围中的数字. //================================================= // F ...
- JSP 属性范围
参考文献:http://www.cnblogs.com/xdp-gacl/p/3781056.html 一.属性范围 所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围 ...
- 取出return array() 数组内容
d.php文件 return array( "0" => 内容一, "1" => 内容二, "2" => 内容三, &qu ...
- 深入理解docker的link机制
https://yq.aliyun.com/articles/55912 摘要: 什么是docker的link机制 同一个宿主机上的多个docker容器之间如果想进行通信,可以通过使用容器的ip地址来 ...
- Web Pages - Efficient Paging Without The WebGrid
Web Pages - Efficient Paging Without The WebGrid If you want to display your data over a number of p ...
- yii2 funson86\yii2-setting
Yii2 Setting for other application, especially for Yii2 Adminlte Installation The preferred way to i ...
- asp.net MVC动态路由
项目中遇到需要动态生成控制器和视图的. 于是就折腾半天,动态生成控制器文件和视图文件,但是动态生成控制器不编译是没法访问的. 找人研究后,得到要领: 1.放在App_Code文件夹内 2.不要命名空间 ...
- gradle 的sourceCompatibility 与 targetCompatibility 区别
sourceCompatibility:指定编译编译.java文件的jdk版本 targetCompatibility:确保class文件与targetCompatibility指定版本,或者更新的j ...
- js使用split函数按照多个字符对字符串进行分割的方法
这篇文章主要介绍了js使用split函数按照多个字符对字符串进行分割的方法,实例分析了split函数的使用技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了js使用split函数按照多个 ...