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的定义
1 // A generic table for looking up objects by (address1, address2, port) 2 // 用于查找对象,通过一个通用表(地址1,地址2,端口) 3 class AddressPortLookupTable { 4 public: 5 // 为内部哈希表fTable创建对象,哈希表的key是3个元素的unsigned int数组 6 AddressPortLookupTable(); 7 // 释放内部哈希表fTable 8 virtual ~AddressPortLookupTable(); 9 10 // 使用address1、address2、port组成key,value为值添加到哈希表 11 // 如果对应key的条目已经存在,返回旧的value,否则返回NULL 12 void* Add(netAddressBits address1, netAddressBits address2, 13 Port port, void* value); 14 // Returns the old value if different, otherwise 0 15 16 //从哈希表中移除key对应的条目,对应条目存在返回true 17 Boolean Remove(netAddressBits address1, netAddressBits address2, 18 Port port); 19 // 从哈希表中查找key对应的value,没找到返回NULL 20 void* Lookup(netAddressBits address1, netAddressBits address2, 21 Port port); 22 // Returns 0 if not found 23 24 // Used to iterate through the entries in the table 25 // 用于遍历在表中的条目 26 class Iterator { 27 public: 28 Iterator(AddressPortLookupTable& table); 29 virtual ~Iterator(); 30 31 void* next(); // NULL iff none 32 33 private: 34 HashTable::Iterator* fIter; //哈希表迭代器 35 }; 36 37 private: 38 friend class Iterator; 39 HashTable* fTable; //哈希表 40 };
AddressPortLookupTable构造与析构
1 AddressPortLookupTable在构造的时候创建哈希表 2 3 AddressPortLookupTable::AddressPortLookupTable() 4 : fTable(HashTable::create(3)) { // three-word keys are used 键使用3个元素的unsigned int数组 5 } 6 7 析构的时候释放哈希表 8 9 AddressPortLookupTable::~AddressPortLookupTable() { 10 delete fTable; 11 }
Add方法(添加表项)
Add
方法使用前三个参数
来组合作为一个key
,第四个参数是value
。创建一个表项添加到哈希表。
如果key
对应的表项在哈希表中已经存在,那么返回值是已经存在表项的旧value
,这个表项的value
替换为参数value
。如果不存在,那就返回NULL
。(表项=条目)
1 // 使用address1、address2、port组成key,value为值添加到哈希表 2 void* AddressPortLookupTable::Add(netAddressBits address1, 3 netAddressBits address2, 4 Port port, void* value) { 5 int key[3]; 6 key[0] = (int)address1; 7 key[1] = (int)address2; 8 key[2] = (int)port.num(); 9 return fTable->Add((char*)key, value); 10 }
Remove方法(移除表项)
Remove
方法用于从哈希表中移除表项,这三个参数依然是用于组成key
的。如果key
在表中存在对应的表项,那么移除后函数返回true
,否则返回false
。
1 //从哈希表中移除key对应的条目,对应条目存在返回true 2 Boolean AddressPortLookupTable::Remove(netAddressBits address1, 3 netAddressBits address2, 4 Port port) { 5 int key[3]; 6 key[0] = (int)address1; 7 key[1] = (int)address2; 8 key[2] = (int)port.num(); 9 return fTable->Remove((char*)key); 10 }
Lookup方法(查找表项)
这里说查找表项,不是很准确,应该是查找表项的value
。如果key
对应的表项不存在,那么就返回NULL
。存在就返回表项的value
。
1 // 从哈希表中查找key对应的value,没找到返回NULL 2 void* AddressPortLookupTable::Lookup(netAddressBits address1, 3 netAddressBits address2, 4 Port port) { 5 int key[3]; 6 key[0] = (int)address1; 7 key[1] = (int)address2; 8 key[2] = (int)port.num(); 9 return fTable->Lookup((char*)key); 10 }
AddressPortLookupTable迭代器方法
AddressPortLookupTable
迭代器还有三个方法,构造
、析构
和next
。其实质是对HashTable::Iterator
的操作。迭代器创建的时候指向哈希表的第一个条目。
构造函数,构造的时候必须绑定一个AddressPortLookupTable
对象。
1 // 创建迭代器,绑定地址端口查找表 2 AddressPortLookupTable::Iterator::Iterator(AddressPortLookupTable& table) 3 // 创建哈希表迭代器,绑定哈希表 4 : fIter(HashTable::Iterator::create(*(table.fTable))) { 5 } 6 7 析构函数,删除迭代器HashTable::Iterator fIter。 8 9 AddressPortLookupTable::Iterator::~Iterator() { 10 delete fIter; 11 }
next
方法的返回值需要注意一下,返回的是当前迭代器指向表中条目的value
。然后迭代器会走向下一个,如果走到哈希表的尾部元素之后,那么返回NULL
。
1 // 返回当前迭代器指向条目的value,迭代器走向下一个 2 void* AddressPortLookupTable::Iterator::next() { 3 char const* key; // dummy 4 return fIter->next(key); 5 }