32 GroupSock(AddressPortLookupTable)——live555源码阅读(四)网络
32 GroupSock(AddressPortLookupTable)——live555源码阅读(四)网络
本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso
本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso
简介
AddressPortLookupTable地址端口查找表类
AddressPortLookupTable类内部定义了一个HashTable* fTable用于保存哈希表的地址。在构造函数中动态创建了一个哈希表对象给它。AddressPortLookupTable使用了两个地址和一个端口号组合作为一个key,value是Add方法的时候确定的。
AddressPortLookupTable类只提供了增删查三种操作,没有提供修改表项的操作。
使用哈希表的优点在于可以快速的查找key对应的value。
AddressPortLookupTable的定义
// A generic table for looking up objects by (address1, address2, port)
// 用于查找对象,通过一个通用表(地址1,地址2,端口)
class AddressPortLookupTable {
public:
// 为内部哈希表fTable创建对象,哈希表的key是3个元素的unsigned int数组
AddressPortLookupTable();
// 释放内部哈希表fTable
virtual ~AddressPortLookupTable(); // 使用address1、address2、port组成key,value为值添加到哈希表
// 如果对应key的条目已经存在,返回旧的value,否则返回NULL
void* Add(netAddressBits address1, netAddressBits address2,
Port port, void* value);
// Returns the old value if different, otherwise 0 //从哈希表中移除key对应的条目,对应条目存在返回true
Boolean Remove(netAddressBits address1, netAddressBits address2,
Port port);
// 从哈希表中查找key对应的value,没找到返回NULL
void* Lookup(netAddressBits address1, netAddressBits address2,
Port port);
// Returns 0 if not found // Used to iterate through the entries in the table
// 用于遍历在表中的条目
class Iterator {
public:
Iterator(AddressPortLookupTable& table);
virtual ~Iterator(); void* next(); // NULL iff none private:
HashTable::Iterator* fIter; //哈希表迭代器
}; private:
friend class Iterator;
HashTable* fTable; //哈希表
};
AddressPortLookupTable构造与析构
AddressPortLookupTable在构造的时候创建哈希表 AddressPortLookupTable::AddressPortLookupTable()
: fTable(HashTable::create()) { // three-word keys are used 键使用3个元素的unsigned int数组
} 析构的时候释放哈希表 AddressPortLookupTable::~AddressPortLookupTable() {
delete fTable;
}
Add方法(添加表项)
Add方法使用前三个参数来组合作为一个key,第四个参数是value。创建一个表项添加到哈希表。
如果key对应的表项在哈希表中已经存在,那么返回值是已经存在表项的旧value,这个表项的value替换为参数value。如果不存在,那就返回NULL。(表项=条目)
// 使用address1、address2、port组成key,value为值添加到哈希表
void* AddressPortLookupTable::Add(netAddressBits address1,
netAddressBits address2,
Port port, void* value) {
int key[];
key[] = (int)address1;
key[] = (int)address2;
key[] = (int)port.num();
return fTable->Add((char*)key, value);
}
Remove方法(移除表项)
Remove方法用于从哈希表中移除表项,这三个参数依然是用于组成key的。如果key在表中存在对应的表项,那么移除后函数返回true,否则返回false。
//从哈希表中移除key对应的条目,对应条目存在返回true
Boolean AddressPortLookupTable::Remove(netAddressBits address1,
netAddressBits address2,
Port port) {
int key[];
key[] = (int)address1;
key[] = (int)address2;
key[] = (int)port.num();
return fTable->Remove((char*)key);
}
Lookup方法(查找表项)
这里说查找表项,不是很准确,应该是查找表项的value。如果key对应的表项不存在,那么就返回NULL。存在就返回表项的value。
// 从哈希表中查找key对应的value,没找到返回NULL
void* AddressPortLookupTable::Lookup(netAddressBits address1,
netAddressBits address2,
Port port) {
int key[];
key[] = (int)address1;
key[] = (int)address2;
key[] = (int)port.num();
return fTable->Lookup((char*)key);
}
AddressPortLookupTable迭代器方法
AddressPortLookupTable迭代器还有三个方法,构造、析构和next。其实质是对HashTable::Iterator的操作。迭代器创建的时候指向哈希表的第一个条目。
构造函数,构造的时候必须绑定一个AddressPortLookupTable对象。
// 创建迭代器,绑定地址端口查找表
AddressPortLookupTable::Iterator::Iterator(AddressPortLookupTable& table)
// 创建哈希表迭代器,绑定哈希表
: fIter(HashTable::Iterator::create(*(table.fTable))) {
} 析构函数,删除迭代器HashTable::Iterator fIter。 AddressPortLookupTable::Iterator::~Iterator() {
delete fIter;
}
next方法的返回值需要注意一下,返回的是当前迭代器指向表中条目的value。然后迭代器会走向下一个,如果走到哈希表的尾部元素之后,那么返回NULL。
// 返回当前迭代器指向条目的value,迭代器走向下一个
void* AddressPortLookupTable::Iterator::next() {
char const* key; // dummy
return fIter->next(key);
}
32 GroupSock(AddressPortLookupTable)——live555源码阅读(四)网络的更多相关文章
- 28 GroupSock(NetAddress)——live555源码阅读(四)网络
28 GroupSock(NetAddress)——live555源码阅读(四)网络 28 GroupSock(NetAddress)——live555源码阅读(四)网络 简介 1) NetAddre ...
- 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 ...
- 29 GroupSock(NetAddressList)——live555源码阅读(四)网络
29 GroupSock(NetAddressList)——live555源码阅读(四)网络 29 GroupSock(NetAddressList)——live555源码阅读(四)网络 简介 Net ...
- 27 GroupSock概述(一)——live555源码阅读(四)网络
27 GroupSock概述(一)——live555源码阅读(四)网络 27 GroupSock概述(一)——live555源码阅读(四)网络 简介 1.网络通用数据类型定义 2.Tunnel隧道封装 ...
- 40 网络相关函数(八)——live555源码阅读(四)网络
40 网络相关函数(八)——live555源码阅读(四)网络 40 网络相关函数(八)——live555源码阅读(四)网络 简介 15)writeSocket向套接口写数据 TTL的概念 函数send ...
- 36 网络相关函数(四)——live555源码阅读(四)网络
36 网络相关函数(四)——live555源码阅读(四)网络 36 网络相关函数(四)——live555源码阅读(四)网络 简介 7)createSocket创建socket方法 8)closeSoc ...
- 39 网络相关函数(七)——live555源码阅读(四)网络
39 网络相关函数(七)——live555源码阅读(四)网络 39 网络相关函数(七)——live555源码阅读(四)网络 简介 14)readSocket从套接口读取数据 recv/recvfrom ...
- 38 网络相关函数(六)——live555源码阅读(四)网络
38 网络相关函数(六)——live555源码阅读(四)网络 38 网络相关函数(六)——live555源码阅读(四)网络 简介 12)makeSocketNonBlocking和makeSocket ...
随机推荐
- Java关键字——transient
当使用Serializable接口实现序列化操作时,如果一个对象中的某一属性不希望被序列化,则可以使用transient关键字进行声明 import java.io.File; import java ...
- Java关键字——super
使用super关键字可以从子类中调用父类中的构造方法.普通方法和属性 与this调用构造方法的要求一样,语句必须放在子类构造方法的首行 this和super都可以调用构造方法,但是两者不能同时出现,调 ...
- js控制全屏窗口
<script src="__PUBLIC__/Js/jquery.min.js"></script> <script type="text ...
- js无间隙滚动
代码一: ; //设置文字滚动速度 dome2.innerHTML=dome1.innerHTML //复制dome1为dome2 function Marquee(){ ) //当滚动至dome1与 ...
- 使用docker exec 就可以进入container,例如:docker exec -it <container_id> /bin/bash
使用docker exec 就可以进入container,例如:docker exec -it <container_id> /bin/bash
- Linux下删除命令
linux删除目录很简单 使用rm -rf命令即可.直接rm就可以了,不过要加两个参数-rf 即:rm -rf 目录名字(警告:不作任何提示,且不可恢复,不要说没提醒哦!严重警告!!!)-r 就是向下 ...
- C-基本语法与运算
编译: Technorati 标记: C 1, 编译compilers 命令make 将高级语言转换为低级语言. clang: 1,预处理(preprocessing) 2,编译(complition ...
- C# Monitoring-network
http://www.codeproject.com/Articles/6259/Monitoring-network-speed
- 遍历JObject
JObject jo = JObject.Parse(jsonStr); IEnumerable<JProperty> properties = jo.Properties(); fore ...
- 如何清理WindowsXp的临时文件
软件限制策略中的 "路径规则" 不允许的, 是指在 这个路径中的程序都 不准运行! 这就限制了 : 通常电脑中病毒, 都是通过上网感染病毒的 -> 病毒/恶意软件通过 &qu ...