• ACE Proactor框架使用实例


    首先你因该针对你应用从ACE_Service_Handler派生:
    #include <ace/Asynch_IO.h>
    #include <ace/Message_Block.h>
    #include <ace/OS.h>

    class HA_Proactive_Service : public ACE_Service_Handler
    {
    private:
        ACE_Asynch_Read_Stream reader_;
        ACE_Asynch_Write_Stream writer_;
    public:
        ~HA_Proactive_Service()
        {
            if (this->handle() != ACE_INVALID_HANDLE)
                ACE_OS::closesocket(this->handle());
        }

        virtual void open(ACE_HANDLE new_handle, ACE_Message_Block &message_block)
        {
            this->handle(new_handle);//新的socket句柄产生了,我们在析构函数里管理了它
            if (this->reader_.open(*this) != 0 ||
                this->writer_.open(*this) != 0)
            {
                ACE_ERROR((LM_ERROR,
                        ACE_TEXT("%p "),
                        ACE_TEXT("HA_Proactive_Service open")));
                delete this;
                return;
            }
            //你可以在这里用this->reader_读数据,或者用this->writer_写数据
            //这就是步骤的第一步(发起I/O操作)
            //。。。

            return;
        }

        // This method will be called when an asynchronous read
        // completes on a stream.
        virtual void handle_read_stream(const ACE_Asynch_Read_Stream::Result &result)
        {
              //数据读完了,我取得了读到的数据mb
              ACE_Message_Block& mb = result.message_block();
              //怎么处理这些数据呢,你看着办吧。
              //。。。

              return;
        }

        // This method will be called when an asynchronous write
        // completes on a stream.
        virtual void handle_write_stream(const ACE_Asynch_Write_Stream::Result &result)
        {
            //数据写完了,你该释放消息块。
            result.message_block().release();

            //。。。

           return;   
        }
       
        //还可重载更多回调函数
    };

    你可以Asynch_Connector和Asynch_Acceptor都依赖HA_Proactive_Service(确切的说是ACE_Service_Handler,HA_Proactive_Service派生自ACE_Service_Handler),所以HA_Proactive_Service可以分成两个不同类,分别根据需要为Asynch_Connector和Asynch_Acceptor服务(这里只是合二为一做示例)。
    Asynch_Connector是这样的:
    #include <ace/INET_Addr.h>
    #include <ace/Proactor.h>
    #include <ace/Asynch_Connector.h>
    #include "HA_Proactive_Service.h"

    ACE_INET_Addr peer_addr(50000, ACE_LOCALHOST); // Set up peer addr
    ACE_Asynch_Connector<HA_Proactive_Service> aio_connect;
    aio_connect.connect(peer_addr);

    ACE_Proactor::instance()->proactor_run_event_loop ();

    Asynch_Acceptor是这样的:

    #include <ace/INET_Addr.h>
    #include <ace/Proactor.h>
    #include <ace/Asynch_Acceptor.h>
    #include "HA_Proactive_Service.h"
    ACE_INET_Addr peer_addr(50000, ACE_LOCALHOST); // Set up peer addr
    Asynch_Acceptor<HA_Proactive_Service> aio_acceptor
    aio_acceptor.open(peer_addr);

    ACE_Proactor::instance()->proactor_run_event_loop ();
  • 相关阅读:
    LINQ 查询介绍
    HTML DOM all 集合
    JavaScript eval() 函数
    软件设计之 数据库设计
    Asp.Net下导出/导入规则的Excel(.xls)文档
    软件设计之 用户界面设计
    HTML DOM focus() 方法
    HTML DOM blur() 方法
    HTML DOM Event 对象
    控件用法参考:GridView的用法大全
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318717.html
Copyright © 2020-2023  润新知