ACE_REACTOR-II

   现在对,《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;

   
}
   


 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值