ACE_Asynch_Acceptor, ACE_Asynch_Connector, ACE_Service_Handler 클래스를 활용하면 Proactor 기반 Acceptor-Connector 프로그램을 제작할 수 있습니다.
본 예제는 에코 서버를 만드는 과정을 설명합니다.
EchoService.h
#pragma once
#include <ace/Asynch_IO.h>
#include <ace/Message_Block.h>
class EchoService:public ACE_Service_Handler
{
private:
ACE_Asynch_Read_Stream read_require_;
ACE_Asynch_Write_Stream write_require_;
ACE_Message_Block msg_;
public:
EchoService(void);
~EchoService(void);
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);
private:
int run();
};
EchoService.cpp
#include "EchoService.h"
#include <iostream>
EchoService::EchoService(void)
:msg_(1024)
{
}
EchoService::~EchoService(void)
{
this->read_require_.cancel();
this->write_require_.cancel();
}
void
EchoService::open (ACE_HANDLE new_handle,ACE_Message_Block &message_block)
{
this->read_require_.open(*this,this->handle(), 0,this->proactor());
this->write_require_.open(*this,this->handle(), 0,this->proactor());
this->run();
}
int
EchoService::run(){
this->msg_.reset();
return this->read_require_.read( this->msg_, this->msg_.capacity());
}
void
EchoService::handle_read_stream (const ACE_Asynch_Read_Stream::Result &result){
if( !result.success() ){
std::cout<<std::endl<<"Error Code:"<< result.error();
delete this;
return;
}
if(0== result.message_block().length()){
std::cout<<std::endl<<" Client Exist";
delete this;
return;
}
this->write_require_.write( result.message_block(), result.message_block().length());
}
void
EchoService::handle_write_stream (const ACE_Asynch_Write_Stream::Result &result){
if( !result.success() ){
std::cout<<std::endl<<"Error Code:"<< result.error();
delete this;
return;
}
if(0== result.message_block().length()){
this->run();
return;
}
this->write_require_.write( result.message_block(), result.message_block().length());
}
PEchoServer2.cpp
// PEchoServer2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <ace/ACE.h>
#include <ace/Asynch_Acceptor.h>
#include "EchoService.h"
#include <ace/Proactor.h>
int _tmain(int argc, _TCHAR* argv[])
{
ACE::init();
{
ACE_Asynch_Acceptor<EchoService> ac;
ac.open(ACE_INET_Addr("192.168.0.2:1000"),0U,true,5,1,ACE_Proactor::instance(), true,1,-1);
ACE_Proactor::instance()->proactor_run_event_loop();
}
ACE::fini();
return 0;
}