ACE是个功能强大的网络库,我们现在使用的是Ace5.3.0b版本做为网络通讯底层的,在不修改ACE原有代码的原则上,在其上封装了一个中间层,下面是实现的大致原理和过程。

具体的ACE内部实现就不说明了,专门的书籍和例子网上很多,这里简单说明一下Ace内部的一些关键字。以便记忆了解。

下面是当时初看ACE的简单记录,不再做整理: /* ACE中重要框架包括: Reactor反应器,Proactor前摄器。他们是事件多路分离组件。他们分派应用专有的处理器,以响应多种类型的事件。 Accepter接受器,Connector连接器。他们分别使主动和被动的初始化任务以及通信服务执行的任务进行偶合。 Configurator服务配置器。这些应用服务可以在安装和运行时动态进行装配。 Stream流组件。这个组件是用来简化一个或多个层次相关服务组成的并发通信应用。

ACE主要提供的任务包括: ·事件多路分离和事件处理分派 ·建立连接和初始化 ·进程间通信和共享内存管理 ·分布式通信服务的动态配置 ·并发/并行和同步 ·高级的分布式服务组件(名字服务,事件服务,日志服务,时间服务,令牌服务)

ACE层次架构如下: ·最底层:C APIS。OS配适层。该层负责将下列方面根据不同的OS进行封装处理。 ·多线程和同步 ·进程间通信 ·事件多路分离 ·显式动态链接 ·内存映射文件和共享内存 ·中间层:C++封装。这里 ·IPC SAP。封装本地和远程的IPC服务访问点机制,包括Socket,TLI,UNIX FIFO,Stream管道以及Win32命名管道。 ·并发机制。这里将低层的OS多线程和多进程机制(如Mutex,信号量)封装为高级的OO并发对象(如主动对象ActiveObject) ·内存管理机制。将管理共享内存和局部内存的动态分配和释放提供了灵活可扩展的抽象。
·上层接口:框架API。 */

另附两张图,也是当时做的,不再做任何补充和说明了。

1:首先我们实现了一个ProactiveHandler的封装类,它是对ACE的前摄器相关的一个封装,我们在它从ACE_Asynch_Acceptor中继承到的open函数(该消息是在ACE_Service_Handler被链接后自动调用的)中做了以下的处理 (1)为本Handler设置一个实质的Proactor (2)为本Handler设置一个异步写入器m_StreamWriter和读取器m_StreamReader (3)为本Handler创建一个消息块 (4)通知逻辑层接收到了一个新连接。 (5)使用m_StreamReader进行第一个消息块的读取。 在handle_read_stream函数中我们进行消息的读取处理,在这里我们将循环遍历ACE的接收队列,将获得的新网络消息添加一个struct MessageHeader,该结构中记录了该消息的来源以及下面消息包的实际大小,然后将这个消息丢去逻辑的消息接收队列,并发送一个事件SetEvent通知给上层逻辑去处理和释放该加工过的消息块,并且在此之后立刻重新生成一个空的消息块准备接受新的消息。 在handle_write_stream函数中我们进行消息的发送处理,这里我们循环遍历Handler的逻辑发送队列,一旦发现有新消息,则将其IO写入ACE的发送队列,并将逻辑队列的消息释放。