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 ...
随机推荐
- Nginx使用webbench进行压力测试
在运维工作中,压力测试是一项非常重要的工作.比如在一个网站上线之前,能承受多大访问量.在大访问量情况下性能怎样,这些数据指标好坏将会直接影响用户体验. 但是,在压力测试中存在一个共性,那就是压力测试的 ...
- js返回顶部
1. function scrollTop(){ $(},); } 2. $("#side-bar .gotop").click(function(){ $(},); //返回顶部 ...
- yourphp读取分类名称{$Categorys[$r[catid]]['catname']}
页面代码: product_list.html 提供分类的id,找出分类的名称 {$Categorys[$r[catid]]['catname']}
- AppDelegate方法中文记录
/// 在程序启动之后,重写自定义设置的位置 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOption ...
- js的DOM对象
1.js的Array对象 ** 创建数组(三种) - var arr1 = [1,2,3]; ...
- 关于IOC的思考
SOLID面向对象的五个设计原则对于开发人员非常重要,其身影在任何大中型软件项目中随处可见,建议必须掌握并灵活应用.此五原则分别为: 单一职责原则(Single Resposibility P ...
- zoj3811 Untrusted Patrol (dfs)
2014牡丹江网络赛C题 (第三水的题 The 2014 ACM-ICPC Asia Mudanjiang Regional First Round http://acm.zju.edu.cn/onl ...
- 正确地组织python项目的结构
统一的项目结构 写了不少python项目后, 越来越认识到python项目结构重要性. 不管项目是否要开源, 是否要提交pypi, 项目结构的一致性带来的好处还有很多: 多人合作开发大家都有个基本的g ...
- 在c#中运行js脚本(将js文件生成为.dll文件)
原文链接:http://www.cnblogs.com/xhan/archive/2010/10/22/1857992.html 前言: 本来在搞一个Google翻译的接口--向Google翻译发送请 ...
- SQL 获取查询IO信息
DBCC DROPCLEANBUFFERS --清空缓存 SET STATISTICS IO ON --开启IO统计 SET STATISTICS TIME ON -- 开启耗时统计 <code ...