现在对,《ACE的使用-Timmer》一文中,所使用的程序在服务器端使用ACE_REACTOR机制。
-src
|--head file
|--Init_Head.h
|--NetWork_Handler.h
|--NetWork_Listener.h
|--source file
|--Main.cpp
|--NetWork_Handler.cpp
|--NetWork_Listener.cpp
一下为各自的代码
//--------------------------
Init_Head.h
//--------------------------
#pragma once
#define WIN32
#define _DEBUG
#include "ace/Reactor.h"
#include "ace/WFMO_Reactor.h"
#include "ace/INET_Addr.h"
#include "ace/SOCK_Stream.h"
#include "ace/SOCK_Acceptor.h"
#include "ace/OS_main.h"
#pragma comment(lib,"aced.lib")
using namespace std;
/*************
NetWork_Handler.h
*************/
#pragma once
#include "Init_Head.h"
class NetWork_Handler : public ACE_Event_Handler
{
public:
NetWork_Handler(void);
~NetWork_Handler(void);
virtual int handle_input(ACE_HANDLE handle);
virtual int handle_close(ACE_HANDLE handle,ACE_Reactor_Mask close_mask);
virtual ACE_HANDLE get_handle() const;
ACE_SOCK_STREAM stream;
};
/************
NetWork_Listener.h
************/
#pragma once
#include "Init_Head.h"
#include "NetWork_Handler.h"
class NetWork_Listener : public ACE_Event_Handler
{
public:
NetWork_Listener(void);
~NetWork_Listener(void);
virtual int handle_input(ACE_HANDLE handle);
virtual int handle_close(ACE_HANDLE handle,ACE_Reactor_Mask close_mask);
virtual ACE_HANDLE get_handle() const;
private:
ACE_INET_Addr local_address;
ACE_SOCK_ACCEPTOR acceptor;
NetWork_Handler *handler;
};
/****************
NetWork_Handler.cpp
****************/
#include "NetWork_Handler.h"
NetWork_Handler::NetWork_Handler(void)
{
}
NetWork_Handler::~NetWork_Handler(void)
{
}
ACE_HANDLE NetWork_Handler::get_handle() const
{
return this->stream.get_handle();
}
int NetWork_Handler::handle_input(ACE_HANDLE handle)
{
ACE_DEBUG((LM_DEBUG, "Network_Handler::handle_input handle = %d/n", handle));
for(;;)
{
char msg[BUFSIZ];
int result = this->stream.recv(msg,sizeof(msg));
if (result > 0)
{
msg[result] = '/0';
ACE_DEBUG ((LM_DEBUG, "Remote message: %s/n", msg));
time_t nTime=0;
time( &nTime ) ;
tm *tm1 = localtime( &nTime ) ;
char res_msg[15];
sprintf(res_msg,"%04d%02d%02d%02d%02d%02d",tm1->tm_year+1900,tm1->tm_mon+1,tm1->tm_mday,tm1->tm_hour,tm1->tm_min,tm1->tm_sec);
stream.send_n(res_msg,sizeof(res_msg));
}
else if (result == 0)
{
ACE_DEBUG ((LM_DEBUG, "Connection closed/n"));
//注意,要返回-1,以便handle_close执行
return -1;
}
else if (errno == EWOULDBLOCK)
{
return 0;
}
else
{
ACE_DEBUG ((LM_DEBUG, "Problems in receiving data, result = %d", result));
return -1;
}
}
}
int NetWork_Handler::handle_close(ACE_HANDLE handle, ACE_Reactor_Mask close_mask)
{
ACE_DEBUG((LM_DEBUG, "Network_Handler::handle_close handle = %d/n", handle));
this->stream.close();
return 0;
}
/******************
NetWork_Listener.cpp
******************/
#include "NetWork_Listener.h"
NetWork_Listener::NetWork_Listener(void):local_address(1500),acceptor(local_address,1)
{
this->reactor(ACE_Reactor::instance());
int result = this->reactor()->register_handler(this,ACE_Event_Handler::ACCEPT_MASK);
ACE_ASSERT (result == 0);
handler = new NetWork_Handler();
}
NetWork_Listener::~NetWork_Listener(void)
{
}
ACE_HANDLE NetWork_Listener::get_handle() const
{
return this->acceptor.get_handle();
}
int NetWork_Listener::handle_input(ACE_HANDLE handle)
{
ACE_DEBUG ((LM_DEBUG, "Network_Listener::handle_input handle = %d/n", handle));
ACE_INET_Addr remote_address;
ACE_SOCK_Stream stream;
// 尝试重新关联事件
int reset_new_handle = this->reactor ()->uses_event_associations ();
int result = this->acceptor.accept (stream, // stream
&remote_address, // 远端地址
0, // 超时设置
1, // 重用地址
reset_new_handle); // reset new handler
ACE_ASSERT (result == 0);
ACE_DEBUG ((LM_DEBUG, "Remote connection from: "));
remote_address.dump ();
handler->stream=stream;
result = this->reactor ()->register_handler (handler,READ_MASK);
ACE_ASSERT (result == 0);
return 0;
}
int NetWork_Listener::handle_close(ACE_HANDLE handle, ACE_Reactor_Mask close_mask)
{
ACE_DEBUG ((LM_DEBUG, "Network_Listener::handle_close handle = %d/n", handle));
this->acceptor.close ();
delete this;
return 0;
}
/**************
Main.cpp
**************/
#include "Init_Head.h"
#include "NetWork_Listener.h"
int ACE_TMAIN (int, ACE_TCHAR *[])
{
NetWork_Listener *listener = new NetWork_Listener();
//开始循环事件处理
ACE_Reactor::run_event_loop ();
return 0;
}