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数据库——CallableStatement接口
建立一个过程,建立的时候要加DELIMITER // IN——只能输入,不能输出,修改之后保留修改的数据 INOUT——可以的输入,也可以输出,修改时输出的是修改后的数据,但是再次输出的时候是最先的数 ...
- $().index() 两种用法
第一种:获得第一个 p 元素的名称和值: $(this).index() <script type="text/javascript"> $(document).rea ...
- js日历插件 中文、英文日历
日历插件 来源网站:http://www.cnblogs.com/yank/archive/2008/08/14/1267746.html 六款英文日历 http://www.bobd.cn/desi ...
- nginx配置图片防盗链
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${ expires 30d; access_log off; valid_referers none blocked ...
- JavaScript数据类型--值类型和引用类型
值类型:也称为原始数据或原始值(primitive value). 这类值存储在栈(stack)中,栈是内存中一种特殊的数据结构,也称为线性表,栈按照后进先出的原则存储数据,先进入的数据被压入栈底,最 ...
- 用实例揭示notify()和notifyAll()的本质区别
用实例揭示notify()和notifyAll()的本质区别 收藏 notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法.两者的最大区别在于: notif ...
- 多线程 GET
iOS中多线程的实现 方案 简介 语言 线程生命周期 使用频率 pthread 一套通用的多线程API 适用于 Unix / Linux / Windows 等系统 跨平台\可移植 使用难度大 C 程 ...
- QQ空间HD(2)-UIPopoverController其它使用
DJTestViewController.m #import "DJTestViewController.h" #import "DJColorTableViewCont ...
- php中pdo例子
下面是从其他博客看到的代码 <?php $dbh = new PDO('mysql:host=localhost;dbname=access_control', 'root', ''); $db ...
- JMS的可靠性
---------------------------------------------------------------------------------------------------- ...