32 GroupSock(AddressPortLookupTable)——live555源码阅读(四)网络

本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso
本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso

简介

AddressPortLookupTable地址端口查找表类
AddressPortLookupTable类内部定义了一个HashTable* fTable用于保存哈希表的地址。在构造函数中动态创建了一个哈希表对象给它。AddressPortLookupTable使用了两个地址和一个端口号组合作为一个keyvalueAdd方法的时候确定的。

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源码阅读(四)网络的更多相关文章

  1. 28 GroupSock(NetAddress)——live555源码阅读(四)网络

    28 GroupSock(NetAddress)——live555源码阅读(四)网络 28 GroupSock(NetAddress)——live555源码阅读(四)网络 简介 1) NetAddre ...

  2. 31 GroupSock(AddressString)——live555源码阅读(四)网络

    31 GroupSock(AddressString)——live555源码阅读(四)网络 31 GroupSock(AddressString)——live555源码阅读(四)网络 简介 Addre ...

  3. 30 GroupSock(Port)——live555源码阅读(四)网络

    30 GroupSock(Port)——live555源码阅读(四)网络 30 GroupSock(Port)——live555源码阅读(四)网络 简介 Port类的定义 Port的构造与全局的 &l ...

  4. 29 GroupSock(NetAddressList)——live555源码阅读(四)网络

    29 GroupSock(NetAddressList)——live555源码阅读(四)网络 29 GroupSock(NetAddressList)——live555源码阅读(四)网络 简介 Net ...

  5. 27 GroupSock概述(一)——live555源码阅读(四)网络

    27 GroupSock概述(一)——live555源码阅读(四)网络 27 GroupSock概述(一)——live555源码阅读(四)网络 简介 1.网络通用数据类型定义 2.Tunnel隧道封装 ...

  6. 40 网络相关函数(八)——live555源码阅读(四)网络

    40 网络相关函数(八)——live555源码阅读(四)网络 40 网络相关函数(八)——live555源码阅读(四)网络 简介 15)writeSocket向套接口写数据 TTL的概念 函数send ...

  7. 36 网络相关函数(四)——live555源码阅读(四)网络

    36 网络相关函数(四)——live555源码阅读(四)网络 36 网络相关函数(四)——live555源码阅读(四)网络 简介 7)createSocket创建socket方法 8)closeSoc ...

  8. 39 网络相关函数(七)——live555源码阅读(四)网络

    39 网络相关函数(七)——live555源码阅读(四)网络 39 网络相关函数(七)——live555源码阅读(四)网络 简介 14)readSocket从套接口读取数据 recv/recvfrom ...

  9. 38 网络相关函数(六)——live555源码阅读(四)网络

    38 网络相关函数(六)——live555源码阅读(四)网络 38 网络相关函数(六)——live555源码阅读(四)网络 简介 12)makeSocketNonBlocking和makeSocket ...

随机推荐

  1. Maven入门学习,安装及创建项目

    一.maven介绍: 1.maven是一个基于项目对象模型(POM Project Object Model),通过配置文件管理项目的工具(项目管理工具). 2.maven主要功能:发布项目(从编译到 ...

  2. Java基本语法笔记

    1. 基本格式: public class HelloWprdApp { public static void main(String[] args) {        // TODO Auto-ge ...

  3. xhprof安装使用

    安装: 到pecl官网下载xhprof的最新版:http://pecl.php.net/package/xhprof wget http://pecl.php.net/get/xhprof-0.9.4 ...

  4. AutoMapper不用任何配置就可以从dynamic(动态)对象映射或映射到dynamic对象。

    http://www.cnblogs.com/farb/p/4934476.html#pz

  5. (HBase) Error: JAVA_HOME is not set and Java could not be found

    请查看Linux系统环境变量 JAVA_HOME 是否设置.. 两种方法 env //查看全部系统变量 或者 echo $JAVA_HOME //查看JAVA_HOME变量值 如果没有设置则输出空 没 ...

  6. maven 错误解决办法集

    一.mavenFailed to execute goal org.apache.maven.plugins:maven-surefire-plugin解决方法 1.测试代码没有获得通过,可以尝重命名 ...

  7. “Transaction rolled back because it has been marked as rollback-only”

    spring的声明事务提供了强大功能,让我们把业务关注和非业务关注的东西又分离开了.好东西的使用,总是需要有代价的.使用声明事务的时候,一 个不小心经常会碰到“Transaction rolled b ...

  8. css使 同一行内的 文字和图片 垂直居中对齐?

    设置父容器, 使 父容器 div 下的所有元素 都 垂直对齐: father-container *{ vertical-align:middle 找回密码

  9. LINUX下搭建VPN

    一.准备 需要 dkms-2.0.17.5-1.noarch.rpm.ppp-2.4.5-33.0.rhel6.x86_64.rpm.pptpd-1.4.0-1.el6.x86_64.rpm,并依次安 ...

  10. [译]JavaScript:将字符串两边的双引号转换成单引号

    原文:http://ariya.ofilabs.com/2012/02/from-double-quotes-to-single-quotes.html 代码的不一致性总是让人发狂,如果每位开发者都能 ...