ACE_Acceptor 클래스는 ACE_Service_Object의 파생 클래스임으로 동적 서비스 객체로 사용 가능하다. init 함수에서 open 함수만 호출하면 됩니다.
ACE_Acceptor::handle_input 함수는 새로운 접속이 있으면 호출됩니다. 내부에서는 서비스 객체를 생성하는 make_svc_handler 함수, 수락 작업을 해주는 accept_svc_handler, 서비스 객체를 최종적으로 활성화하는 activate_svc_handler 함수가 호출됩니다. 3 함수 모드 가상 함수로 훅 메서드로 사용이 가능합니다.
ACE_Acceptor 파생 클래스로 쉽게 서비스 어답터를 만들어낼 수 있습니다.
–서비스 로더 부분 코딩
ServiceLoader2.cpp
// ServiceLoader2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <ace/ACE.h>
#include <ace/Service_Config.h>
#include <ace/Reactor.h>
int main(int argc, char* argv[])
{
ACE::init();
{
ACE_Service_Config::open( argc, argv);// svc.conf
ACE_Reactor::instance()->run_reactor_event_loop();
}
ACE::fini();
return 0;
}
svc.conf
dynamic EchoServiceTest Service_Object * EchoService3:_make_ECHO_SERVICE() "-a 192.168.0.2:1000"
– 서비스 부분 코딩
AcceptorAdapter.h
#pragma once
#include <ace/Acceptor.h>
template<typename SVC, typename ACC>
class AcceptorAdapter:public ACE_Acceptor<SVC, ACC>
{
public:
AcceptorAdapter(void);
~AcceptorAdapter(void);
virtual int init (int argc, ACE_TCHAR *argv[]);
};
#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
#include "AcceptorAdapter.cpp"
#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
AcceptorAdapter.cpp
#include "AcceptorAdapter.h"
#include <ace/Get_Opt.h>
#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */
template<typename SVC, typename ACC>
AcceptorAdapter<SVC,ACC>::AcceptorAdapter(void)
{
}
template<typename SVC, typename ACC>
AcceptorAdapter<SVC,ACC>::~AcceptorAdapter(void)
{
}
//-a 192.168.0.2:5000
template<typename SVC, typename ACC> int
AcceptorAdapter<SVC,ACC>::init (int argc, ACE_TCHAR *argv[]){
char* p = "192.168.0.2:1000";
ACE_Get_Opt opt(argc,argv, "a:", 0);
for( int c; -1 != (c= opt()) ; ){
if('a'== c ){
p = opt.opt_arg();
}
}
ACC::PEER_ADDR addr(p);
return this->open( addr );
}
EchoService.h
#pragma once
#include <ace/Svc_Handler.h>
#include <ace/SOCK_Stream.h>
#include <ace/Synch.h>
class EchoService:public ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH>
{
private:
typedef ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH> PARENT;
public:
EchoService(void);
~EchoService(void);
virtual int handle_input (ACE_HANDLE fd = ACE_INVALID_HANDLE);
virtual int open (void * = 0);
};
EchoService.cpp
#include "EchoService.h"
#include <iostream>
EchoService::EchoService(void)
{
}
EchoService::~EchoService(void)
{
}
int
EchoService::handle_input (ACE_HANDLE fd/* = ACE_INVALID_HANDLE*/){
char buf[1024];
ssize_t len = this->peer().recv( buf, 1024);
if(len<=0){
std::cout<<std::endl<<" Client Exit:";
return -1;
}
buf[len]=0;
std::cout<<std::endl<< buf;
this->peer().send( buf, len);
return 0;
}
int
EchoService::open (void * data/* = 0*/){
std::cout<<std::endl<<" Client Enter:";
return PARENT::open(data);
}
ServiceList.cpp
#include "EchoService.h"
#include "AcceptorAdapter.h"
#include <ace/SOCK_Acceptor.h>
typedef AcceptorAdapter<EchoService, ACE_SOCK_Acceptor> ECHO_SERVICE;
#define MY_SERVICE_Export __declspec(dllexport)
ACE_FACTORY_DEFINE( MY_SERVICE, ECHO_SERVICE);