ACE:Reactor框架处理事件和多个I/O流

本文详细介绍了ACE Reactor框架处理事件和多个I/O流的机制。通过创建并注册`ACE_Event_Handler`的子类,如`ClientService`和`ClientAccept`,来处理输入、输出和连接事件。`ClientService`使用`ACE_Message_Queue`对发送数据进行排队,确保线程安全。文章还探讨了如何在处理I/O事件时,通过`handle_input`、`handle_output`和`handle_close`方法回调来管理连接和服务。
摘要由CSDN通过智能技术生成

 ACE Reactor框架:

    只要做三件事:

        1.从ACE_Event_Handler派生一个或多个类,并给各个虚回调方法增加应用特有的事件处理行为

        2.向ACE_Reactor类登记应用的事件处理对象,把每个事件处理对象与它感兴趣的事件关联起来

        3.运行ACE_Reactor事件循环

一个接受连接的例子:

1.#include <iostream> 2.#include "ace/auto_ptr.h" 3.#include "ace/log_msg.h" 4.#include "ace/inet_addr.h" 5.#include "ace/sock_acceptor.h" 6.#include "ace/reactor.h" 7.8.#include "ace/Message_Block.h" 9.#include "ace/Message_Queue.h" 10.#include "ace/SOCK_Stream.h" 11.12.#include "ace/Null_Mutex.h" 13.#include "ace/Null_Condition.h" 14.15.16.using namespace std;
17.//服务客户 18.class ClientService:public ACE_Event_Handler
19.{
20.public:
21.    ACE_SOCK_Stream &peer(void)
22.    {
23.        return this->sock_;
24.    }
25.    int open(void);
26.    virtual ACE_HANDLE get_handle(void) const27.    {
28.        return this->sock_.get_handle();
29.    }
30.    virtual int handle_input(ACE_HANDLE fd=ACE_INVALID_HANDLE);
31.    virtual int handle_output(ACE_HANDLE fd=ACE_INVALID_HANDLE);
32.    virtual int handle_close(ACE_HANDLE handle,ACE_Reactor_Mask close_mask);
33.34.protected:
35.    ACE_SOCK_Stream sock_;
36.    ACE_Message_Queue<ACE_NULL_SYNCH> output_queue_;
37.};
38.int ClientService::open(void)
39.{
40.    ACE_TCHAR peer_name[512];
41.    ACE_INET_Addr peer_addr;
42.    if(this->sock_.get_remote_addr(peer_addr)==0&&peer_addr.addr_to_string(peer_name,512)==0)
43.        cout<<" connection from "<<peer_name<<endl;
44.    return this->reactor()->register_handler(this,ACE_Event_Handler::READ_MASK);
45.}
46.int ClientService::handle_input(ACE_HANDLE)
47.{
48.    const size_t INPUT_SIZE=4096;
49.    char buffer[INPUT_SIZE];
50.    ssize_t recv_cnt,send_cnt;
51.    if((recv_cnt=this->sock_.recv(buffer,sizeof(buffer)))<=0)
52.    {
53.        ACE_DEBUG((LM_DEBUG,ACE_TEXT("(%P|%t) connection closed/n")));
54.        return -1;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值