l 并发和同步:ACE的适配层封装了用于多线程、多进程和同步的OS API。
l 进程间通信(IPC)和共享内存:ACE的适配层封装了用于本地和远地IPC、以及共享内存的OS API。
l 事件多路分离机制:ACE的适配层封装了用于对基于I/O、定时器、信号和同步的事件进行同步和异步多路分离的OS API。
l 显式动态链接:ACE的适配层封装了用于显式动态链接的OS API。显式动态链接允许在安装时或运行时对应用服务进行配置。
l 文件系统机制:ACE的适配层封装了用于操作文件和目录的OS文件系统API。
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内存管理组件为管理进程间共享内存和进程内堆内存的动态分配和释放提供了灵活和可扩展的抽象。
l 事件多路分离组件:ACE Reactor(反应堆)和Proactor(前摄器)是可扩展的面向对象多路分离器,它们分派应用特有的处理器,以响应多种类型的基于I/O、定时器、信号和同步的事件。
l 服务初始化组件:ACE Acceptor(接受器)和Connector(连接器)组件分别使主动和被动的初始化任务与初始化一旦完成后通信服务所执行的应用特有的任务去耦合。
l 服务配置组件:ACE Service Configurator(服务配置器)支持应用的配置,这些应用的服务可在安装时和/或运行时动态装配。
l 分层的流组件:ACE Stream组件简化了像用户级协议栈这样的由分层服务组成的通信软件应用的开发。
l ORB适配器组件:通过ORB适配器,ACE可以与单线程和多线程CORBA实现进行无缝集成。
1、 当一个新客户需要获取服务名对应的服务器信息时,首先向服务器注册客户信息,获得一个SessionID,并在定位服务器上注册自己的信息(IP,证书,SessionID等)。
ACE Acceptor-Connector框架用来发送和接收消息,使用ACE Acceptor-Connector框架构成服务定位器的通讯框架。
发送消息
|
接收消息
|
二、 他使“被动地连接IPC端点、创建/激活与其他相关联的服务处理器”所必需的各步骤得以自动化。
方法
|
描述
|
ACE_Acceptor()
open()
|
将接受器的被动模式IPC端点绑定到特定地址,比如TCP端口号和IPC主机地址,然后对连接请求的到达进行侦听。
|
~ACE_Acceptor()
close()
|
关闭接受器的IPC端点,并释放其资源。
|
acceptor()
|
返回指向底层PEER_ACCEPTOR的引用。
|
方法
|
描述
|
handle_input()
|
当连接请求从对端连接器到达时,反应器会调用该模板方法。它可以使用在下面概述的3个方法来使“被动地连接IPC端点并创建与其相关联的服务处理器”所必需的各步骤自动化
|
make_svc_handler()
|
这个工厂方法创建服务处理器来处理通其已连接的IPC端点、从对端服务发出的数据请求
|
accept_svc_handler()
|
这个挂钩方法是用接受器的被动模式IPC端点来创建已连接的IPC端点,并将此端点与和服务处理器相关联的一个I/O句柄封装在一起
|
active_svc_handler()
|
这个挂钩方法调用服务处理器的open()挂钩方法,让服务处理器完成对自己的初始化
|
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);
一、 它提供了一个IPC工厂,可以同步地或反应式地主动与对端接受器建立连接。可以通过ACE的许多IPC wrapper façade类来参数化这个IPC端点的类型,从而将较低级的连接机制与应用级服务初始化策略分离开来。
二、 它使“主动连接IPC端点、以及创建并激活与其相关联的服务处理器所必需的各步骤”得以自动化。
方法
|
描述
|
ACE_Connector ()
open()
|
用于初始化接受器的方法。
|
~ACE_Connector ()
close()
|
释放其资源。
|
Connector ()
|
返回指向底层PEER_ACCEPTOR的引用。
|
方法
|
描述
|
connect()
|
应用会在想要将某个服务处理器连接到在侦听的对端时,调用这个模板方法。它可以使用下面的3个方法来使“主动连接某个IPC端点,创建并激活与其相关联的服务处理器”所必需的各步骤自动化
|
make_svc_handler()
|
这个工厂方法创建服务处理器,后者会使用已连接的IPC端点
|
connect_svc_handler()
|
这个挂钩方法使用服务器的IPC端点来同步或异步地主动连接端点
|
active_svc_handler()
|
这个挂钩方法调用服务处理器的open()挂钩方法,后者允许服务处理器在连接建立之后完成对其自身的初始化
|
handle_output()
|
在异步发起的连接请求完成之后,反应器会调用这个模板方法。它调用active_svc_handler()方法,以让服务处理器对其自身进行初始化
|
cancel()
|
取消某个服务处理器,其连接之前是被异步发起的。调用者(不是连接器)负责关闭服务处理器
|
template<class Message_Handler>
class PS_Connector : public ACE_Connector<Message_Handler, ACE_SOCK_CONNECTOR>
class testConnector : public PS_Connector<ClientHandler>
int PS_Connector<Message_Handler>::open (ACE_Reactor *r,int flags)
template<class Message_Handler>
int PS_Connector<Message_Handler>::make_svc_handler (Message_Handler *&sh)
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)
方法
|
描述
|
newSession()
|
新会话
|
getSession()
|
获取指定会话的值
|
isActiveSession()
|
判断指定会话是否正在使用中
|
updateSession()
|
更新某会话的值
|
removeSession()
|
删除某会话
|
openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095
文件名
|
描述
|
privkey_server.pem
|
服务端的私钥文件
|
cacert_server.pem
|
服务端的证书文件
|
privkey.pem
|
客户端的私钥文件
|
cacert.pem
|
客户端的证书文件
|
消息处理模块
|
头模块
|
成员名
|
格式
|
描述
|
totalLength
|
ACE_CDR::ULong
|
数据长度
|
type
|
ACE_CDR::UShort
|
命令类别
|
subtype
|
ACE_CDR::UShort
|
命令子类别
|
LENGTH
|
ACE_CDR::ULong
|
消息长度
|
类名
|
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
|
|
bool operator == (const UUID & r) const
return 0 ==::memcmp(this,&r,sizeof(UUID));
[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,
[10] (美)James Rumbaugh,The UML Reference Manual,Addsion-Wesley,1999年