针对Socket API不直接支持“主动连接”模式,ACE将“连接管理”所涉及的三个角色:
主动连接角色(active connection role)
被动连接角色(passive connnection role)
通信角色(communication role)
分别以类的形式提供给使用者以降低复杂度:
ACE_SOCK_Connector
ACE_SOCK_Connector类是一个工厂(factory),用来主动建立一信的通信端。
功能:
·发起一个到“对等接受者(peer acceptor)”的连接,并在连接建立后初始化一个ACE_SOCK_Stream对象。
·连接可以通过“阻塞”、“非阻塞”或“定时”方式发起。
ACE_SOCK_Connector的两个主要方法:
connect() 通过“阻塞”、“非阻塞”和“定时”模式之一,主动连接某一网络地址上的ACE_SOCK_Stream。
complete() 结束一个“非阻塞”连接并初始化一个ACE_SOCK_Stream。
ACE_SOCK_Stream
ACE_SOCK_Stream定义了一个“数据模式”的“只传输(transfer-only)”对象。ACE_SOCK_Stream对象不能用作其他任何角色;若不是有意破坏它的接口,它就只能用作“数据传输”角色。
ACE_SOCK_Stream类封装了“数据模式”socket支持的数据传输机制。功能如下:
·支持数据的发送和接收。发送和接收的字节数最多n个或刚好n个。
·支持“分散读取(scatter-read)”操作、。这些操作涉及多个“调用者提供(caller-supplied)”的缓冲区,而不是单个连续的缓冲区。
·支持“集中写入(gather-write)”的操作。在单个操作中传输多个非连续数据缓冲区中的数据。
·支持“阻塞”、“非阻塞”、“定时”I/O操作。
·支持泛型编程技术,可以借助“参数化类型”实现功能上的批量转换。
ACE_SOCK_Stream输出的主要方法:
send()/recv() 发送、接收数据库缓冲区数据。读、写的字节数可能比请求的字节数少,因为它们要受“OS中的缓冲机制”和“传输协议中的流量控制”影响。
send_n()/recv_n() 发送、接收恰好n个字节的缓冲区数据,简化“少量写入”和“少量读取”时的应用程序处理。
recvv_n()/sendv_n() 使用OS的“分散读取”系统函数,高效、完整地接收/发送多个缓冲区数据。
ACE_SOCK_Acceptor
ACE_SOCK_Acceptor类是一个“工厂(factory)”,用来“被动”地建立一个信的通信端点。他提供以下功能:
·接受来自对等连接端(peer connector)的连接,并在连接建立后初始化ACE_SOCK_Stream对象。
·连接可以通过“阻塞”、“非阻塞”或“定时”的方式接受。
·运用C++ traits支持泛型编程技术;从而,可以通过C++“参数化类型”实现功能上的批量转换。
主要的两个方法:
open() 初始化“被动模式”、“工厂”socket,被动侦听一个指定的ACE_INET_Addr地址。
accept() 通过一个新接受的客户连接初始化ACE_SOCK_Stream参数。
ACE_Message_Block
ACE 中为了高效进行消息相关的管理,降低动态内存管理的开销,减少不必要的数据复制,而提供了ACE_Message_Block类。 ACE_Message_Block使用了Composite模式,使得能够将消息灵活地组合,从而支持复合消息。在类中定义友元 ACE_Data_Block,并提供一个指向ACE_Data_Block的指针。而ACE_Data_Block则采用引用计数以共享数据,降低内存 复制带来的额外开销。
主要方法:
ACE_Message_Block()/init() 对消息进行初始化。
msg_type() 设置和获取消息的类型。
msg_priority() 设置和获取消息的优先级。
clone() 返回消息的完整“深复制(deep copy)”。
duplicate() 返回消息的“浅(shollow)”复制,将其引用计数增1。
release() 将引用计数减1,如果计数值降至0,则释放消息的资源。
set_flags() 将指定的数据位同一组已有的标志执行“按位或”操作,用以指定消息的语意(例如消息释放时是否删除缓冲区,等等)。
copy() 从缓冲区中复制n个字节到消息。
rd_ptr() 设置和获取“读”指针。
wr_ptr() 设置和获取“写”指针。
cont() 设置和获取消息中的“连接”字段,这个字段用于将复合消息连接在一起。
nest()/prev() 设置和获取“指向ACE_Message_Queue中的双向消息列表”的指针。
length() 设置和获取消息的当前长度,即wr_ptr() - rd_ptr()。
total_length() 获取消息的长度,包括所有被连接的消息块。
size() 设置和获取消息的总容量,包括分配在[rd_ptr(),wr_ptr()]范围之前及之后的存储容量。