zoukankan      html  css  js  c++  java
  • 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 ();
  • 相关阅读:
    python gevent(协程模块)
    python基础之socket与socketserver
    python 使用 with open() as 读写文件
    Python logger模块
    python二维码操作:QRCode和MyQR入门
    常见的端口号及其用途
    python中hasattr()、getattr()、setattr()函数的使用
    mysql数据库自带数据库介绍
    关于BeautifulSoup4 解析器的说明
    学习opencv(1)
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318717.html
Copyright © 2011-2022 走看看