ACE的Reactor用法

整體的主要是服務端的,唯一比較大的區別來說應該是比example來的更好理解(個人感受)

下面上代碼

//acceptor.h

#include "ace/Event_Handler.h"
#include "ace/INET_Addr.h"
#include "ace/Reactor.h"
#include "ace/SOCK_Stream.h"
#include "ace/SOCK_Acceptor.h"

class Handle_data;

class Acceptor: public ACE_Event_Handler
{
    public:
	    Acceptor( ACE_Reactor *r = ACE_Reactor::instance() ):ACE_Event_Handler(r){}
	    	
	    ACE_INT32 open( const ACE_UINT16 port );	
		ACE_INT32 handle_input( ACE_HANDLE = ACE_INVALID_HANDLE );
		ACE_INT32 handle_close( ACE_HANDLE = ACE_INVALID_HANDLE, ACE_Reactor_Mask = 0 );
		
		ACE_HANDLE get_handle() const
		{
			return acceptor_.get_handle();
		}
		ACE_SOCK_Acceptor &get_acceptor(){ return acceptor_; }
	private:
	     ~Acceptor(){};
    private:
        ACE_SOCK_Acceptor  acceptor_;	
};


acceptor.cpp

#include "ace/Log_Msg.h"
#include "acceptor.h"
#include "handle_data.h"

ACE_INT32 Acceptor::open( ACE_UINT16 port )
{
	
	ACE_INET_Addr  addr;
	addr.set( port, (ACE_UINT32)INADDR_ANY );
	if (acceptor_.open( addr ) == -1)
	{
		ACE_DEBUG( (LM_DEBUG, "accept open error\n") );
		return -1;
	}
	return reactor()->register_handler( this, ACE_Event_Handler::ACCEPT_MASK );	
}


ACE_INT32 Acceptor::handle_input( ACE_HANDLE handle )
{
	Handle_data  *handle_data = 0;
	ACE_NEW_RETURN( handle_data, Handle_data( reactor() ), -1 );
	//等待鏈接
	if (acceptor_.accept( handle_data->get_peer() ) == -1)
	{
		ACE_DEBUG( (LM_DEBUG, "accept handle input accept error!\n") );
		handle_data->handle_close();
		return -1;
	}
	//獲取遠程鏈接地址
	else if (handle_data->open() == -1)
	{
		ACE_DEBUG( (LM_DEBUG, "accept handle input open error!\n") );
		handle_data->handle_close();
		return -1;
	}
	else
	{
		ACE_DEBUG( (LM_DEBUG, "accept handle input ok!\n") );
		return 0;
	}	
}


ACE_INT32 Acceptor::handle_close( ACE_HANDLE handle, ACE_Reactor_Mask mask )
{
	acceptor_.close();
	delete this;
	ACE_DEBUG( (LM_DEBUG, "accept handle close ok!\n") );
	return 0;	
}


handle_data.h

#include "ace/Event_Handler.h"
#include "ace/SOCK_Stream.h"
#include "ace/INET_Addr.h"
#include "ace/Reactor.h"
#include "ace/Time_Value.h"

class Handle_data: public ACE_Event_Handler
{
	public:		
	    Handle_data( ACE_Reactor *r = ACE_Reactor::instance() ):ACE_Event_Handler(r)  {}
	    ACE_INT32 open( );
	    ACE_INT32 handle_input( ACE_HANDLE = ACE_INVALID_HANDLE );
	    ACE_INT32 handle_close( ACE_HANDLE = ACE_INVALID_HANDLE, ACE_Reactor_Mask mask = 0 );
	    ACE_INT32 handle_output (ACE_HANDLE fd = ACE_INVALID_HANDLE);
	    ACE_HANDLE get_handle( ) const
		{
			return peer_.get_handle();
		}
		ACE_SOCK_Stream &get_peer()
		{
			return peer_;
		}
	private:	
		~Handle_data(){ACE_DEBUG( (LM_DEBUG, "handle data ~dctor .\n") );};
	private:	
		ACE_SOCK_Stream  peer_;		
};


handle_data.cpp

#include "ace/SOCK_Stream.h"
#include "ace/Reactor.h"
#include "ace/Event_Handler.h"
#include "ace/Log_Msg.h"
#include "ace/Timer_Queue.h"
#include "handle_data.h"
#include <iostream>

ACE_INT32 Handle_data::open( )
{	
	ACE_INT32 ret = 0;
	ACE_INET_Addr remote_addr;	
	get_peer().get_remote_addr( remote_addr );		
	ACE_DEBUG( (LM_DEBUG, "the remote addr is %s\n", remote_addr.get_host_addr())  );
	//註冊句柄
	//ACE_Event_Handler::ACCEPT_MASK
	ret = reactor()->register_handler( this, ACE_Event_Handler::READ_MASK| ACE_Event_Handler::WRITE_MASK);
	if (ret != -1)	
	{		
		ACE_DEBUG( (LM_DEBUG, "handle data register ok!\n")  );		
	}	
	return ret;
}





ACE_INT32 Handle_data::handle_close( ACE_HANDLE , ACE_Reactor_Mask )
{	
	get_peer().close();
	ACE_DEBUG( (LM_DEBUG, "handle data close.\n") );
	delete this;
	return 0;
}
//數據接收
ACE_INT32 Handle_data::handle_input( ACE_HANDLE )
{	
	ACE_INT8 buf[512] = {0};
	ACE_INT32 len;
	  
	len = get_peer().recv( buf, 500);
	if (len > 0)
	{
		ACE_DEBUG( (LM_DEBUG, "recv data %s, len:%d.\n", buf, len) );
		
	    return 0;
	}
	else if (len == 0)
	{
		ACE_DEBUG( (LM_DEBUG, "recv data len is 0, client exit.\n") );
		return -1;
	}
	else
	{
		ACE_DEBUG( (LM_DEBUG, "recv data error len < 0" ) );
		return -1;
	}	
	
}
//數據發送
ACE_INT32 Handle_data::handle_output( ACE_HANDLE fd /*= ACE_INVALID_HANDLE*/ )
{
	get_peer().send_n("hello Client\n",12);
	return 0;
}

main.cpp

#include "ace/Log_Msg.h"
#include "acceptor.h"
#include "handle_data.h"

ACE_INT32 main( ACE_INT32 argc, char **argv )
{
	ACE_UINT16  port = 0;
	/*if (argc < 2) 
	return -1;*/
	//port = ACE_OS::atoi(argv[1]);
	port = 60000;
	Acceptor    *accept;
	
	ACE_NEW_RETURN( accept, Acceptor( ACE_Reactor::instance () ),-1 );
	if (accept->open( port ) == -1)
	{
		accept->handle_close();
		ACE_DEBUG( (LM_DEBUG, "main open error!\n") );
		return -1;
	}	
	if (ACE_Reactor::run_event_loop() ==-1)
	{
		accept->handle_close();
		ACE_DEBUG( (LM_DEBUG, "main run event loop error!\n") );
		return -1;
	}
	accept->handle_close();
	return 0;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章