ACE的Socket网络编程

    技术2022-05-18  19

    针对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()]范围之前及之后的存储容量。


    最新回复(0)