ACE_Proactor示例

#include <iostream>
using namespace std;

#include "ace/Init_ACE.h"
#include "ace/INET_Addr.h"
#include "ace/Proactor.h"
#include "ace/Asynch_Acceptor.h"
#include "ace/Asynch_Connector.h"

class MyServiceHandler;
typedef ACE_Asynch_Acceptor<MyServiceHandler> ServiceAcceptor;
typedef ACE_Asynch_Connector<MyServiceHandler> ServiceConnector;

class MyServiceHandler : public ACE_Service_Handler
{
public:
    virtual ~MyServiceHandler();
    virtual void open(ACE_HANDLE new_handle, ACE_Message_Block &message_block);
    virtual void handle_read_stream (const ACE_Asynch_Read_Stream::Result &result);
    virtual void handle_write_stream(const ACE_Asynch_Write_Stream::Result &result);
    virtual void addresses(const ACE_INET_Addr &remote_address, const ACE_INET_Addr &local_address);

protected:
    ACE_Asynch_Read_Stream reader;
    ACE_Asynch_Write_Stream writer;
};

MyServiceHandler::~MyServiceHandler()
{
    ACE_OS::closesocket(handle());
}

void MyServiceHandler::open(ACE_HANDLE new_handle, ACE_Message_Block &message_block)
{
    this->handle(new_handle);
    if( reader.open(*this, handle()) == -1 || writer.open(*this, handle()) == -1 ) {
        return;
    }
    
    ACE_Message_Block* pMB = new ACE_Message_Block(512);
    reader.read(*pMB, 512);
}

void MyServiceHandler::handle_read_stream(const ACE_Asynch_Read_Stream::Result &result)
{
    if( !result.success() ) {
        return;
    }

    ACE_Message_Block* pMB = &result.message_block();

    *(pMB->wr_ptr()+1) = 0;
    cout << result.bytes_to_read() << " "
         << result.bytes_transferred() << " "
         << result.message_block().wr_ptr()
         << endl;

    pMB->length(0);
    char buf[32] = {0};
    ACE_OS::sprintf(buf, "Client %d", this->handle());
    pMB->copy(buf, ACE_OS::strlen(buf));
    writer.write(*pMB, pMB->length());
}

void MyServiceHandler::handle_write_stream(const ACE_Asynch_Write_Stream::Result &result)
{
    result.message_block().release();
    delete this;
}

void MyServiceHandler::addresses(const ACE_INET_Addr &remote_address, const ACE_INET_Addr &local_address)
{
    cout << remote_address.get_ip_address() << endl;
}


int main(int argc, char* argv[])
{
    ACE::init();

    ACE_INET_Addr addr(10000);
    ServiceAcceptor acceptor;
    if( acceptor.open(addr) == -1 ) {
        cout << "Open port failed ";
        return -1;
    }
    cout << "Listen port ok ... ";

    ACE_Proactor::instance()->proactor_run_event_loop();
    
    ACE::fini();
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章