ACE前摄器Proactor模式示例程序

45 篇文章 0 订阅
38 篇文章 0 订阅

ACE前摄器Proactor模式示例程序,在ACE 6.0.0版测试通过。

1. 服务器端代码(ProactorServer.cpp)

#include "ace/Message_Queue.h"
#include "ace/Asynch_IO.h"
#include "ace/Proactor.h"
#include "ace/Asynch_Acceptor.h"


class HA_Proactive_Service : public ACE_Service_Handler
{
public:
~HA_Proactive_Service ()
{
if (this->handle () != ACE_INVALID_HANDLE)
ACE_OS::closesocket (this->handle ());
}

virtual void open (ACE_HANDLE h, ACE_Message_Block&)
{
     this->handle (h);
     if (this->reader_.open (*this) != 0 )
     {
         ACE_ERROR ((LM_ERROR, ACE_TEXT ("%p\n"),
             ACE_TEXT ("HA_Proactive_Service open")));
         delete this;
         return;
     }

     ACE_Message_Block *mb = new ACE_Message_Block(buffer,1024);
     if (this->reader_.read (*mb, mb->space ()) != 0)
     {
         ACE_OS::printf("Begin read fail\n");
         delete this;
         return;
     }

     return;
}

//异步读完成后会调用此函数
virtual void handle_read_stream
(const ACE_Asynch_Read_Stream::Result &result)
{
     ACE_Message_Block &mb = result.message_block ();
     if (!result.success () || result.bytes_transferred () == 0)
     {
         mb.release ();
         delete this;
         return;
     }

     mb.copy("");    //为字符串添加结束标记'\0'
     ACE_OS::printf("rev:\t%s",mb.rd_ptr());
     mb.release();

     ACE_Message_Block *nmb = new ACE_Message_Block(buffer,1024);
     if (this->reader_.read (*nmb, nmb->space ()) != 0)

     return;
}

private:
ACE_Asynch_Read_Stream reader_;
char buffer[1024];
};


int main(int argc, char *argv[]) 
{
    int port=3000;
    ACE_Asynch_Acceptor<HA_Proactive_Service> acceptor;

    if (acceptor.open (ACE_INET_Addr (port)) == -1)
        return -1;

    while(true)
        ACE_Proactor::instance ()->handle_events ();
    
    return 0; 
} 


2. 客户端代码(ProactorClient.cpp)

#include "ace/Message_Queue.h"
#include "ace/Asynch_IO.h"
#include "ace/Proactor.h"
#include "ace/Asynch_Connector.h"
#include "ace/OS_NS_unistd.h"


class HA_Proactive_Service : public ACE_Service_Handler
{
public:
~HA_Proactive_Service ()
{
if (this->handle () != ACE_INVALID_HANDLE)
ACE_OS::closesocket (this->handle ());
}

virtual void open (ACE_HANDLE h, ACE_Message_Block&)
{
	char  time[100];

     this->handle (h);
     if (this->writer_.open (*this) != 0 )
     {
         ACE_ERROR ((LM_ERROR, ACE_TEXT ("%p\n"),
             ACE_TEXT ("HA_Proactive_Service open")));
         delete this;
         return;
     }

     ACE_OS::printf("connceted");

     for(int i=0;i<10;i++)    //每隔秒中发送时间至服务器
     {
		 ACE_OS::sleep(1);
         time_t now = ACE_OS::gettimeofday().sec();
		 ctime_s(time, sizeof(time),&now);   //获取当前时间的字符串格式
         ACE_Message_Block *mb = new ACE_Message_Block(100);
         mb->copy(time);

         if (this->writer_.write(*mb,mb->length()) !=0)
         {
             ACE_OS::printf("Begin read fail\n");
             delete this;
             return;
         }
     }

     return;
}

//异步写完成后会调用此函数
virtual void handle_write_dgram
(const ACE_Asynch_Write_Stream::Result &result)
{
     ACE_Message_Block &mb = result.message_block ();
     mb.release();
     return;
}

private:
ACE_Asynch_Write_Stream writer_;
};

int main(int argc, char *argv[]) 
{
    
    ACE_INET_Addr addr(3000,"localhost"); 

    ACE_Asynch_Connector<HA_Proactive_Service> connector;
    
    connector.open();
    if (connector.connect(addr) == -1)
        return -1;

    while(true)
        ACE_Proactor::instance ()->handle_events ();
    
    return 0; 
} 


3. 执行结果

执行服务器端后执行客户端,服务器端收到客户端发来的时间信息:

rev:    Fri Jun 13 17:19:36 2014
rev:    Fri Jun 13 17:19:37 2014
rev:    Fri Jun 13 17:19:38 2014
rev:    Fri Jun 13 17:19:39 2014
rev:    Fri Jun 13 17:19:40 2014
rev:    Fri Jun 13 17:19:41 2014
rev:    Fri Jun 13 17:19:42 2014
rev:    Fri Jun 13 17:19:43 2014
rev:    Fri Jun 13 17:19:44 2014
rev:    Fri Jun 13 17:19:45 2014

参考:http://www.cnblogs.com/TianFang/archive/2006/12/31/608952.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值