军械工程学院本科毕业论文
基于ACE的服务定位器
2006届计算机工程专业
指导教员:张剑炜
学员姓名:庄泽南
军械工程学院
二零零六年六月
论 文 摘 要
ACE自适配通信环境(ADAPTIVE Communication Environment)是使用C++来开发通信软件的成熟套件。本文将阐述使用ACE开发服务定位器,服务定位器是RBR系统中的服务定位模块,处理管理层中,服务定位器为客户端访问服务层资源提供一个统一定位服务。
服务定位器实现以下功能:
1、存储服务层各服务的IP、端口、证书等信息,并能提供查询、更新、删除功能。
2、存储客户端的会话ID(SessionID)、证书、连接时间等,并能提供创建、更新等功能。
3、对客户端的证书进行验证,对客户端的SessionID的正确性、时效性进行验证。
4、根据客户端的请求,发送服务器IP、端口等信息。
5、网络程序的一般通讯功能。
在服务定位器中,我们使用了ACE的众多框架,其中ACE Accpetor-Connector框架用来实现服务器和客户端之间的通讯;ACE Streams工作流用来处理服务器和客户端之间的消息;ACE_Message_Block用来存储消息的消息的连接等;ACE CDR提供了对ACE_Message_Block进行整编和解编的格式化工具。
在服务定位器的设计中,按照以下流程完成消息的处理:
1、当一个新客户需要获取服务名对应的服务器信息时,首先向服务器注册客户信息,获得一个SessionID,并在定位服务器上注册自己的信息(IP,证书,SessionID等)。
2、如果客户要申请一个服务时,先向定位服务器申请获取服务器列表,如果所要获取的服务不存在,则放弃。
3、如果存在该服务,客户端向服务器申请该服务的服务器信息,保存在本地。
最后,提出了服务定位器的改进方式,主要是使用SessionID来管理连接的方式。
关键字:ACE,服务定位器,网络通信,RBR系统
目        录

图1-1 ACE层次结构图
1.2.1 ACE OS适配层
该层用C写成,直接驻留在本地OS API之上。它提供轻型的类POSIX OS适配层,将ACE中的其他层及组件和以下与OS API相关联的平台专有特性屏蔽开来:

l       并发和同步:ACE的适配层封装了用于多线程、多进程和同步的OS API。

l       进程间通信(IPC)和共享内存:ACE的适配层封装了用于本地和远地IPC、以及共享内存的OS API。

l       事件多路分离机制:ACE的适配层封装了用于对基于I/O、定时器、信号和同步的事件进行同步和异步多路分离的OS API。

l       显式动态链接:ACE的适配层封装了用于显式动态链接的OS API。显式动态链接允许在安装时或运行时对应用服务进行配置。

l       文件系统机制:ACE的适配层封装了用于操作文件和目录的OS文件系统API。

ACE OS适配层的可移植性使得ACE可运行在许多操作系统上。ACE已在广泛的OS平台上进行了移植和测试,包括Win32(也就是,在Intel和Alpha平台,使用MSVC++、Borland C++ Builder和IBM Visual Age的WinNT 3.5.x、4.x、2000、Win95/98和WinCE)、Mac OS X、大多数版本的UNIX(例如,SPARC和Intel上的Solaris 1.x和2.x、SGI IRIX 5.x和6.x、DG/UX、HP-UX 9.x、10.x和11.x、DEC/Compaq UNIX 3.x和4.x、AIX 3.x和4.x、UnixWare、SCO,以及可自由使用的UNIX实现,比如Debian Linux 2.x、RedHat Linux 5.2、6.x和7.x、FreeBSD和NetBSD)、实时操作系统(比如,LynxOS、VxWorks、Chorus ClassiX 4.0、QnX Neutrino、RTEMS和PSoS)、MVS OpenEdition和CRAY UNICOS。
由于ACE的OS适配层所提供的抽象,所有这些平台使用同一棵代码树。这样的设计极大地增强了ACE的可移植性和可维护性。此外,还有Java版本的ACE可用(http://www.cs.wustl.edu/~eea1/JACE.html)。
1.2.2 OS接口的C++包装外观
可以直接在ACE OS适配层之上编写高度可移植的C++应用。但是,大多数ACE开发者使用的是上图中所示的C++包装外观层。通过提供类型安全的C++接口(这些接口封装并增强本地的OS并发、通信、内存管理、事件多路分离、动态链接和文件系统API),ACE包装外观简化了应用的开发。应用可以通过有选择地继承、聚合和/或实例化下面的组件来组合和使用这些包装:

l       并发和同步组件:ACE对像互斥体和信号量这样的本地OS多线程和多进程机制进行抽象,以创建高级的OO并发抽象,像主动对象(Active Object)和多态期货(Polymorphic Future)。

l       IPC和文件系统组件:ACE C++包装对本地和/或远地IPC机制进行封装,比如socket、TLI、UNIX FIFO和STREAM管道,以及Win32命名管道。此外,ACE C++包装还封装了OS文件系统API。

l       内存管理组件:ACE内存管理组件为管理进程间共享内存和进程内堆内存的动态分配和释放提供了灵活和可扩展的抽象。

ACE C++包装提供了许多与ACE OS适配层一样的特性。但是,这些特性是采用C++类和对象、而不是独立的C函数来构造的。这样的OO包装有助于减少正确地学习和使用ACE所需的努力。
例如,C++的使用提高了应用的健壮性,因为C++包装是强类型的。所以,编译器可在编译时、而不是运行时检测类型系统违例。相反,不到运行时,不可能检测像socket或文件系统I/O这样的C一级OS API的类型系统违例。
ACE采用了许多技术来降低或消除额外的性能开销。例如,ACE大量地使用C++内联来消除额外的方法调用开销;这样的开销可由OS适配层和C++包装所提供的额外的类型安全和抽象层次带来。此外,对于性能要求很高的包装,比如socket和文件I/O的send/recv方法,ACE会避免使用虚函数。
1.2.3构架
ACE还含有一个高级的网络编程构架,集成并增强了较低层次的C++包装外观。该构架支持将并发分布式服务动态配置进应用。ACE的构架部分包含以下组件:

l       事件多路分离组件:ACE Reactor(反应堆)和Proactor(前摄器)是可扩展的面向对象多路分离器,它们分派应用特有的处理器,以响应多种类型的基于I/O、定时器、信号和同步的事件。

l       服务初始化组件:ACE Acceptor(接受器)和Connector(连接器)组件分别使主动和被动的初始化任务与初始化一旦完成后通信服务所执行的应用特有的任务去耦合。

l       服务配置组件:ACE Service Configurator(服务配置器)支持应用的配置,这些应用的服务可在安装时和/或运行时动态装配。

l       分层的流组件:ACE Stream组件简化了像用户级协议栈这样的由分层服务组成的通信软件应用的开发。

l       ORB适配器组件:通过ORB适配器,ACE可以与单线程和多线程CORBA实现进行无缝集成。

ACE构架组件便利了通信软件的开发,它们无需修改、重编译、重链接,或频繁地重启运行中的应用,就可被更新和扩展。在ACE中,这样的灵活性是通过结合以下要素来获得的:(1)C++语言特性,比如模板、继承和动态绑定,(2)设计模式,比如抽象工厂、策略和服务配置器,以及(3)OS机制,比如显式动态链接和多线程。
1.3 OpenSSL简介
1998年,OpenSSL项目组接管了OpenSSL的开发工作,并推出了OpenSSL的0.9.1版,到目前为止,OpenSSL的算法已经非常完善,对SSL2.0、SSL3.0以及TLS1.0都支持。OpenSSL目前最新的版本是0.9.7b版。OpenSSL采用C语言作为开发语言,这使得OpenSSL具有优秀的跨平台性能,这对于广大技术人员来说是一件非常美妙的事情,可以在不同的平台使用同样熟悉的东西。OpenSSL支持Linux、Windows、BSD、Mac、VMS等平台,这使得OpenSSL具有广泛的适用性。
作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。
1.3.1非对称加密算法
OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。
1.3.2密钥和证书管理
密钥和证书管理是PKI的一个重要组成部分,OpenSSL为之提供了丰富的功能,支持多种标准。OpenSSL实现了对证书的X.509标准编解码、PKCS#12格式的编解码以及PKCS#7的编解码功能。并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能。
1.3.3应用程序
OpenSSL的应用程序提供了相对全面的功能,以至于可以把这些应用程序作为OpenSSL的指令。OpenSSL的应用程序主要包括密钥生成、证书管理、格式转换、数据加密和签名、SSL测试以及其它辅助配置功能。
第二章 服务定位器需求分析
2.1 RBR灾难恢复系统
RBR系统是网络灾难恢复系统,该系统由三个逻辑层组成:客户层、管理层(中间层)和服务层。其中,客户层代表系统所管理的客户计算机的资源;管理层由备份适配器、认证服务器、管理控制台等组成,构成系统的管理核心;服务层代表提供存储的服务器资源。三层中,管理层处于管理业务逻辑的核心。
系统的结构模型如下图2-1所示:

图2-1 RBR系统结构模型
2.2 服务定位器需求分析
2.2.1服务定位器的引入
服务定位器是RBR系统中的服务定位模块,处理管理层中。如下图2-2所示,服务定位器为客户端访问服务层资源提供一个统一定位服务:

图2-2 服务定位器示意图
在RBR系统中,如果客户端能直接访问服务层的各个服务器,那么将存在两个问题:
1、必然会在客户端中暴露服务层各个服务器的IP地址,为黑客攻击服务器定下目标,从而造成严重的安全问题。
2、如果服务层的服务期IP配置发生改变,客户端必须手动更新所有的服务端IP配置,增加了客户端操作的复杂性。
为解决以上问题,我们引入了服务定位器。当客户端向服务层的服务器提交请求时,并不直接发往各个服务器,而是先对服务定位器发送需求服务请求;当服务定位器接收到客户端发送的服务需求请求时,在本地数据库中查询客户端所需求的服务名,并验证证书和会话ID等的正确性,如果通过验证,将客户端请求的服务所在的服务器IP、证书等发返给客户端。
2.2.2服务定位器的功能
为实现以上功能,服务定位器必须有以下功能:
1、存储服务层各服务的IP、端口、证书等信息,并能提供查询、更新、删除功能。
2、存储客户端的会话ID(SessionID)、证书、连接时间等,并能提供创建、更新等功能。
3、对客户端的证书进行验证,对客户端的SessionID的正确性、时效性进行验证。
4、根据客户端的请求,发送服务器IP、端口等信息。
5、网络程序的一般通讯功能。
2.3 服务定位器的概要设计
2.3.1系统流程设计
根据2.2节的功能分析,我们设计出服务定位器的系统流程,如下图所示:

1、当一个新客户需要获取服务名对应的服务器信息时,首先向服务器注册客户信息,获得一个SessionID,并在定位服务器上注册自己的信息(IP,证书,SessionID等)。

2、如果客户要申请一个服务时,先向定位服务器申请获取服务器列表,如果所要获取的服务不存在,则放弃。
3、如果存在该服务,客户端向服务器申请该服务的服务器信息,保存在本地。
为直观表明各模块之间的消息传递和程序执行顺序,下面给出各模块的合作图:

图2-4 服务定位器合作图
2.3.2系统框架设计
ACE为网络通讯程序提供了一整套框架的解决方案,在服务定位器中,我们主要使用其下列框架:
一、ACE Acceptor-Connector框架

ACE Acceptor-Connector框架用来发送和接收消息,使用ACE Acceptor-Connector框架构成服务定位器的通讯框架。

二、Stream框架
Stream框架用来实现消息的处理,在服务定位器中我们同Stream实现了两个工作流:协议栈流和业务流。
发送消息
接收消息

下图显示了这两个框架在系统中的作用、以及它们如何合作:一、            他提供了一个被动模式的IPC端点,用于侦听和接受来自对端的连接。这个IPC端点的类型可以通过ACE的许多IPC wrapper façade类来参数化,从而使较低级的连接机制与应用级服务初始化策略分离开来。

二、            他使“被动地连接IPC端点、创建/激活与其他相关联的服务处理器”所必需的各步骤得以自动化。

3.2.2 ACE_Accpetor框架的使用
ACE_Acceptor类模板可以通过两个类来参数化:SVC_HANDLER类和PEER_ACCEPTOR。ACE_Acceptor类有灵活的接口,可由应用开发者进行广泛的定制,我们将其分为两个范畴:
一、接受器的初始化
下列方法用于初始化和销毁ACE_Acceptor对象。
表 3-1 接受器初始化
方法
描述
ACE_Acceptor()
open()
将接受器的被动模式IPC端点绑定到特定地址,比如TCP端口号和IPC主机地址,然后对连接请求的到达进行侦听。
~ACE_Acceptor()
close()
关闭接受器的IPC端点,并释放其资源。
acceptor()
返回指向底层PEER_ACCEPTOR的引用。
二、连接建立和服务处理器初始化方法
表3-2 服务处理器创建
方法
描述
handle_input()
当连接请求从对端连接器到达时,反应器会调用该模板方法。它可以使用在下面概述的3个方法来使“被动地连接IPC端点并创建与其相关联的服务处理器”所必需的各步骤自动化
make_svc_handler()
这个工厂方法创建服务处理器来处理通其已连接的IPC端点、从对端服务发出的数据请求
accept_svc_handler()
这个挂钩方法是用接受器的被动模式IPC端点来创建已连接的IPC端点,并将此端点与和服务处理器相关联的一个I/O句柄封装在一起
active_svc_handler()
这个挂钩方法调用服务处理器的open()挂钩方法,让服务处理器完成对自己的初始化
下图显示了应用程序使用Accpetor的运行过程:

图3-1 应用程序实现Acceptor框架
一般来说,一个端口服务使用一个Accpetor实例,所以在一个程序中一般只有一个Acceptor实例。在实际程序中,我们可以利用Acceptor模板创建我们所需要的类,并重载上述三个服务处理器方法。
3.2.3 Acceptor框架在服务定位器中的运用
在本程序中,我们直接使用Acceptor的模版创建一个Acceptor类:

class Acceptor : public ACE_Acceptor<ClientHandler, ACE_SOCK_ACCEPTOR>

然后重载上述的方法:

virtual int open (const ACE_SOCK_ACCEPTOR::PEER_ADDR &local_addr,

ACE_Reactor *reactor = ACE_Reactor::instance (),

int flags = 0,

int use_select = 1,

int reuse_addr = 1);

virtual int make_svc_handler (ClientHandler *&sh);

virtual int accept_svc_handler (ClientHandler *sh);

其中ClientHandler是我们设计的一个服务处理器,他用来处理消息,具体参阅第六章。
3.3 利用ACE Connector组件完成服务定位器的消息发送
3.3.1 ACE_Connector类
在3.2中,我们叙述了Acceptor作为被动的服务端的特点及实现方法。相应地,在客户端我们用Connector框架实现主动连接。Acceptor解除“服务处理器的功能”与“主动地连接和初始化它们所需的各步骤”的耦合。在大量对端进行通信的网络化应用中,可能需要主动、并发地建立大量连接,并在完成时进行处理。为了将这些能力合并进灵活、可扩展和可复用的抽象中,ACE Acceptor-Connector框架定义了ACE_Connector类。
ACE_Connector是一个工厂类,它实现了Acceptor-Connector模式[POSA2]中的Connector角色。这个类提供以下能力:

一、            它提供了一个IPC工厂,可以同步地或反应式地主动与对端接受器建立连接。可以通过ACE的许多IPC wrapper façade类来参数化这个IPC端点的类型,从而将较低级的连接机制与应用级服务初始化策略分离开来。

二、            它使“主动连接IPC端点、以及创建并激活与其相关联的服务处理器所必需的各步骤”得以自动化。

这个模板类通过以下两个类来参数化:SVC_HANDLER类和PEER_CONNECTOR类。
3.3.2 ACE_Connector框架的使用
ACE_Connector类有灵活的接口,可由应用开发者进行广泛的定制,我们将其分为两个范畴:
表3-3 Connector对象的初始化
方法
描述
ACE_Connector ()
open()
用于初始化接受器的方法。
~ACE_Connector ()
close()
释放其资源。
Connector ()
返回指向底层PEER_ACCEPTOR的引用。
表3-4 服务处理器的初始化
方法
描述
connect()
应用会在想要将某个服务处理器连接到在侦听的对端时,调用这个模板方法。它可以使用下面的3个方法来使“主动连接某个IPC端点,创建并激活与其相关联的服务处理器”所必需的各步骤自动化
make_svc_handler()
这个工厂方法创建服务处理器,后者会使用已连接的IPC端点
connect_svc_handler()
这个挂钩方法使用服务器的IPC端点来同步或异步地主动连接端点
active_svc_handler()
这个挂钩方法调用服务处理器的open()挂钩方法,后者允许服务处理器在连接建立之后完成对其自身的初始化
handle_output()
在异步发起的连接请求完成之后,反应器会调用这个模板方法。它调用active_svc_handler()方法,以让服务处理器对其自身进行初始化
cancel()
取消某个服务处理器,其连接之前是被异步发起的。调用者(不是连接器)负责关闭服务处理器
下图显示了应用程序使用Connector的运行过程:

图3-2 应用程序实现Connector框架
3.3.3 Connector框架在服务定位器中的运用
为了统一管理connector框架在系统中的应用,我们没有直接将ACE_Connector模板实现为类,而是采用Template Method模式重新设计一个模板类PS_Connector,然后在各个程序中实现我们新建立的模板类,如下图所示:

图3-2 ACE_Connector模板类的实现
建立自定义模板类:

template<class Message_Handler>

class PS_Connector : public ACE_Connector<Message_Handler, ACE_SOCK_CONNECTOR>

利用自定义模板类实现类:

class testConnector : public PS_Connector<ClientHandler>

在自定义的模板类上实现服务器初始化方法:
一、实现open()方法

int PS_Connector<Message_Handler>::open (ACE_Reactor *r,int flags)

二、实现make_svc_handler()方法

template<class Message_Handler>

int PS_Connector<Message_Handler>::make_svc_handler (Message_Handler *&sh)

三、实现connect_svc_handler()方法

template<class Message_Handler>

int PS_Connector<Message_Handler>::connect_svc_handler (Message_Handler *&svc_handler,

const ACE_SOCK_CONNECTOR::PEER_ADDR &remote_addr,

ACE_Time_Value *timeout,

const ACE_SOCK_CONNECTOR::PEER_ADDR &local_addr,

int reuse_addr,

int flags,

int perms)

当客户端开始连接时候,执行connect_svc_handler()方法,因此我们可以通过定义connect_svc_handler()方法来实现连接时所需要做的事情,在服务定位器中,我们定义了SSL 认证。
3.4 Session连接池
3.4.1传统的Socket指针连接方式
传统的网络通讯程序一般都是用Socket指针来标示连接的客户端,如下图所示:

图3-5 SessionPool连接池类图
下表给出了各个方法的描述:
表3-5 SessionPool连接池方法描述
方法
描述
newSession()
新会话
getSession()
获取指定会话的值
isActiveSession()
判断指定会话是否正在使用中
updateSession()
更新某会话的值
removeSession()
删除某会话
在连接池中,我们使用了ACE_Hash_Map_Manager_Ex模版类来生成哈希表存储连接信息,哈希表的内容如下:
IDClass --à RecClass
其中,IDClass用于存储管理SessionID,RecClass用于存储连接信息(客户消息消息类别、子类别、失效时间)。
3.5 服务定位器中的SSL认证
在ACE Acceptor-Connector框架中,我们设置了SSL验证来保证连接的安全性。OpenSSL可以保证所有的数据通信都在SSL的信道里进行,在服务定位器中,我们没有让全部数据通过SSL加密,而是在连接建立的时候验证证书的有效性,验证通过后立即断开SSL连接。
3.5.1 OpenSSL证书的生成
OpenSSL提供了两种证书生成方式,一种是由CA签名的证书,一种是不需要CA签名的证书。在服务定位器中,为了降低复杂性,我们并没有架设CA服务器来验证分发的证书。
以下命令用来生成证书的密钥:
openssl genrsa -des3 -out privkey.pem 2048
以下命令用来生成证书:

openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095

我们用这个命令来生成两对证书,分别用于服务端和客户端:
表3-5 用于SSL的证书列表
文件名
描述
privkey_server.pem
服务端的私钥文件
cacert_server.pem
服务端的证书文件
privkey.pem
客户端的私钥文件
cacert.pem
客户端的证书文件
3.5.2 SSL连接验证
我们利用下图来表示SSL连接的流程:

图4-1 Stream框架
4.2 服务定位器的Stream框架
4.2.1头模块和尾模块的实现
如图4-1所示,Stream流框架的头部和尾部各有一个模块用来处理与流外进行的数据交流。如下图所示,我们给出了服务定位器所使用的流框架图:
消息处理模块
头模块

图5-1 通讯消息类图
下面,我们给出各个消息的内容:
表5-2 Commad类内容
成员名
格式
描述
totalLength
ACE_CDR::ULong
数据长度
type
ACE_CDR::UShort
命令类别
subtype
ACE_CDR::UShort
命令子类别
LENGTH
ACE_CDR::ULong
消息长度
所有的消息通过type和subtype来标识:
类名
type值
subtype值
cs_ServiceListRequest
11
1
sc_ServiceListResponse
12
1
cs_ServiceRequest
11
2
sc_BadRequest1
12
2
sc_BadRequest2
12
3
sc_GoodRequest
12
3
cs_Register2Service
12
4
5.2服务定位器传输消息方法
5.2.1 ACE_Message_Block消息类
在定位服务器中,所有的消息都通过ACE_Message_Block类来存储,ACE_Message_Block类以字符串形式存储消息,可以直接将消息在网络上进行传输。ACE_Message_Block可以灵活、高效地共享数据,并能降低内存复制带来的额外开销。ACE_Message_Block允许多条消息连接在一起,形成一个单链表,从而支持复合消息。所有的ACE_Message_Block都带有一个读指针(由rd_ptr()控制)和一个写指针(由wr_ptr()控制)。下面我们给出ACE_Message_Block类图:

Head
Token = “"/t~BeGiN";

三、cs_Register2Service的处理

cs_Register2Service消息用来注册到某个服务,申请新ID。当新用户初次访问服务,或老用户的SessionID被拒绝时,应使用此消息。在建立新ID的时候我们使用windows系统的RPC.h提供的UUID结构。它是有时间和网卡地址所决定的ID结构,因此能保证唯一性,代码为:
UUID SessionID;//新建一个UUID结构
UuidCreate(&SessionID);//建立一个UUID
此外,我们重载运算符==以方便SessionID的比较:

bool operator == (const UUID & r) const

{

return 0 ==::memcmp(this,&r,sizeof(UUID));

}
处理后的消息放入业务流处理框架,然后发回客户端,完成消息的传递。
结束语
在网络飞速发展的今天,各式各样的网络程序的开发也越来越成熟。ACE是相当成熟的网络开发套件,其高效性、跨平台性使得越来越多的人开始使用他开发网络软件。
本次毕业设计我们就利用ACE开发了服务定位器,开发出了高效、扩展能力强的软件。在本次开发中,熟悉ACE环境是比较重要的,因为其复杂的框架和众多的类,所以熟悉起来也比较困难,在开发过程中,我大概用了一个多月来熟悉ACE的环境。在aCE比较困难的地方是,ACE_Message_block类的使用,ACE Acceptor-Connector框架的使用,ACE Streams框架的使用。在ace的使用中,熟悉了大量的设计模式的实现方式,学习了很多面向对象的软件设计方法。另外OPENSSL的使用也给了服务定位器安全上的保证,但由于这方面资料大多为英文,所以使用起来进度也比较慢。
       在程序设计的时候,一个主要的难点就是字符的长度控制,由于消息都是格式化的消息,因此不同消息其字符长度不同,因此在处理的时候需要考虑到消息的长度变化所带来的影响,在程序测试的时候,这方便所出现的问题给程序设计带来比较大的麻烦和调试的时间代价,在下一步的网络通讯程序设计的时候可以参考较优秀的消息处理方式以提高自身程序的水平。
       最后我们实现了服务定位器的功能,使得客户端能根据服务名在服务定位器查询目标服务的服务器信息。在OPENSSL验证的实现中,我们没有考虑到验证失效后的处理。另外在服务列表信息的存储和客户端信息的存储中,我们使用的是ACE的文件存储方式,在改进的时候,我们可以使用HASH表将服务列表信息和客户端信息存储到HASH表中,然后再利用文件存储,这样能保证更加安全高效。此外,现在在验证的时候。使用IP来标识客户端,在改进的时候可以使用Sessionid来标识客户端,保证他的唯一性和时效性。通过以上的改进,相信能改进出更完善的服务定位器。
致谢
历时三个月的毕业设计到此结束了。在本次的毕业设计中,张剑炜教员给予了我很大的帮助,在课题的确定、资料的搜集、课题的研究与设计、论文的修改到论文的完成给了我极大的指导和支持,可以说没有张剑炜教员,这个课题是无法完成的。张教员严谨的教学作风和极高的学术水平,给予我极大的熏陶。在此,表示我由衷地感谢。
在大学四年的生活中,军械工程学院的教员在我人生最宝贵、最重要的时间里,给了我生活上和学习上的关心和指导,特别是计算机工程系的教员,他们在专业学习上给了我极大的指导。在此特别感谢你们。
另外,在大学四年中,我们的队干部对我们生活和做人上给予了关心和指导,在此感谢你们。还有和我们一起生活四年的同学们和朋友们,你们是我人生最宝贵的财富。
参考文献

[1] (美)Douglas C. Schmidt著 於春景 译:C++网络编程 卷一,华中科技大学出版社,2003年12月

[2] (美)Douglas C. Schmidt 著 马维达 译:C++网络编程 卷二,电子工业出版社,2004年1月

[3] (美) Douglas C. Schmidt 著: C++NPv1幻灯片,www.dre.vanderbilt.edu/~schmidt/

[4] (美) Douglas C. Schmidt 著: C++NPv2幻灯片,www.dre.vanderbilt.edu/~schmidt/

[4] (美)Douglas C. Schmidt著 马维达 译:ACE自适配通信环境中文技术文档

[5] (美)Douglas C. Schmidt 著:ACE Software Development Guidelines,

 http://www.cs.wustl.edu/~schmidt/rules.html
[6]张剑炜 著:ACE笔记,2005年8月
[7]钱能 著:C++程序设计教程,清华大学出版社,2003年5月
[8] (美) Bruce Eckel,Thinking in C++,China Machine Press 2005年1月
[8]周伯生 著:标准建模语言UML,北京计算机世界,1998年

[10] (美)James Rumbaugh,The UML Reference Manual,Addsion-Wesley,1999年

基于ACE的服务定位器(图失效)相关推荐

  1. java网络编程作业基于UDP简单聊天窗口,图形化界面,包含客户端和服务端

    //郑州轻工业大学 //题号:实验四 第二题 //题目:使用基于UDP的网络编程方法,完成客户端和服务器间的聊天功能.要求图形界面. java网络编程作业 基于UDP简单聊天窗口,图形化界面,包含客户 ...

  2. 数据驱动应用(三):异构数据服务(基于有向无环图DAG)

    概述 主要概念 数据服务(Data Service):对异构数据源,基于有向无环图,提供异构数据的查询和推送能力. 指标:用于衡量事物发展程度的单位或方法,它还有个IT上常用的名字,也就是度量.例如: ...

  3. 基于ACE Proactor框架下高并发、大容量吞吐程序设计既最近的一个产品开发总结

    Reactor与 Proactor 基本概念 在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O ...

  4. 基于位置的服务器,用于基于位置的服务的移动台-服务器协议

    具体实施方式 以下将结合示例性无线通信系统和相关联的基于位置的服务来示出本发明.然而,应当理解,本发明不限于与任何特定类型的无线系统或者基于位置的服务结合使用.公开的技术适于与各种其他系统结合使用,并 ...

  5. php service locator,Yii源码解读-服务定位器(ServiceLocator)

    SL的目的也是解耦,并且非常适合基于服务和组件的应用. Service Locator充当了一个运行时的链接器的角色,可以在运行时动态地修改一个类所要选用的服务, 而不必对类作任何的修改. 一个类可以 ...

  6. NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成...

    原文:NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成 本篇内容属于非实用性(拿来即用)介绍,如对框架设计没兴趣的朋友,请略过. 快一个月没有写博 ...

  7. ①Windows Server 8基于远程桌面服务方案的安装

    今天呢,我正式开始给大家介绍一同分享Windows Server 8的远程桌面服务有什么新的变化和内容了,虽然目前是Beta版,但我觉得大的方向和内容应该变化不到哪去了,同时Windows Serve ...

  8. TCP/IP网络编程之基于TCP的服务端/客户端(二)

    回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...

  9. 分布式面试 - 如何基于 dubbo 进行服务治理、服务降级、失败重试以及超时重试?

    分布式面试 - 如何基于 dubbo 进行服务治理.服务降级.失败重试以及超时重试? 面试题 如何基于 dubbo 进行服务治理.服务降级.失败重试以及超时重试? 面试官心理分析 服务治理,这个问题如 ...

最新文章

  1. (C++)从字符串中取出整形、浮点型和字符串
  2. rethat linux安装nginx,RedHat和CentOS下Nginx安装
  3. 谷歌浏览器扩展程序XDM_请立即更新您的谷歌Chrome浏览器 获取重要的安全补丁程序...
  4. 构建LAMP平台(一)(软件版本:httpd-2.4.16,php-5.6.12,mysql-5.6.26)
  5. java中奇偶数的判断
  6. leetcode76. 最小覆盖子串
  7. oracle暂停索引,Oracle索引被抑制情况
  8. unordered_map 简介
  9. 2019中国旅游与酒店风云榜酒店业榜单公布
  10. Linux平台Libyuv使用指南
  11. H.266/VVC相关技术学习笔记3:帧内色度预测模式中的DM模式及其在N次会议上相关的提案总结
  12. 我的【藏羚头条】开发运营经验
  13. web前端学习(一):国内最常用,又优秀的web框架,Vue渐近式框架
  14. matlab收获,matlab实习心得体会 1700字
  15. 深耕技术,与实践赛跑:一文告诉你如何稳妥快速完善区块链技术并有序推动商用​?...
  16. 音乐原唱伴唱卡拉ok模式解决!
  17. SLAM十四讲 ch4 Sophus库安装避雷和使用
  18. 怎么在计算机网络广播中发话,如何用电脑发网络传真?手把手教大家具体操作步骤...
  19. 英语面试中五大典型问题及其回答技巧
  20. 在Linux直接运行安卓程序

热门文章

  1. 狂神说Java-Redis笔记
  2. 软件项目管理指南:定义、5大过程、估算及进度管理方法等
  3. 帝国cms灵动标签调用当前栏目下所有子栏目链接,子栏目名称,子栏目图片
  4. java计算机毕业设计房屋租赁网站源码+mysql数据库+系统+lw文档+部署
  5. python 实时行情_Python实现股票行情接收V010
  6. 百度首页设计(HTML)
  7. 52单片机 (十七)AD DA 数模转换
  8. 生鲜电商迎巨变?美菜撤出县城,有菜被集团关停
  9. 解决mendeley文献管理软件无法显示部分文献中文的办法
  10. 细说马斯洛需求层次理论与产品的关系——老吴说产品