生活随笔
收集整理的這篇文章主要介紹了
ACE proactor example
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
網上看的兩個好的例子-學習ACE時經??吹摹?/p>
這個文章應該是介紹ACE編程的一個很好的原創文章,個人非常推薦了!
1、WIN32下面用proactor可以達到幾乎RAW IOCP的效率,由于封裝關系,應該是差那么一點。
?
客戶端處理類的常規寫法:
[cpp] view plain
copy ??class?ClientHandler?:?public?ACE_Service_Handler??{??public:???????ClientHandler(unsigned?int?client_recv_buf_size=SERVER_CLIENT_RECEIVE_BUF_SIZE)???:_read_msg_block(client_recv_buf_size),_io_count(0)??{??}??????~ClientHandler(){}????????void?init();????????void?fini();??????????void?check_time_out(time_t?cur_time);????public:????????????????virtual?void?open?(ACE_HANDLE?handle,ACE_Message_Block?&message_block);?????????virtual?void?handle_read_stream?(const?ACE_Asynch_Read_Stream::Result?&result);???????????virtual?void?handle_write_stream?(const?ACE_Asynch_Write_Stream::Result?&result);????private:???????*???*?/param?void????*?/return?0-成功,-1失敗???*/??int??initiate_read_stream??(void);???????????int??initiate_write_stream?(ACE_Message_Block?&?mb,?size_t?nBytes?);?????????int?check_destroy();??????ACE_Asynch_Read_Stream?_rs;??????ACE_Asynch_Write_Stream?_ws;??????ACE_Message_Block?_read_msg_block;????????????ACE_Recursive_Thread_Mutex?_lock;??????long?_io_count;??????????time_t?_last_net_io;????private:??????????????????????private:????public:??????????ClientHandler?*_next;????ClientHandler?*next(){return?_next;}????void?next(ClientHandler?*obj){_next=obj;}????};?????????????void?ClientHandler::handle_read_stream?(const?ACE_Asynch_Read_Stream::Result?&result)??{??_last_net_io=ACE_OS::time(NULL);??int?byterecved=result.bytes_transferred?();??if?(?(result.success?())?&&?(byterecved?!=?0))??{????????????if(handle_received_data()==true)???{??????????????_read_msg_block.crunch();????initiate_read_stream();???}??}??????????{???ACE_Guard<ACE_Recursive_Thread_Mutex>?locker?(_lock);???_io_count--;??}??check_destroy?();??}????void?ClientHandler::init()??{????????_last_net_io=ACE_OS::time(NULL);??_read_msg_block.rd_ptr(_read_msg_block.base());??_read_msg_block.wr_ptr(_read_msg_block.base());??this->handle(ACE_INVALID_HANDLE);??}????bool?ClientHandler::handle_received_data()??{??????...........自己處理??return?true;??}????????void?ClientHandler::handle_write_stream?(const?ACE_Asynch_Write_Stream::Result?&result)??{????????MsgBlockManager::get_instance().release_msg_block(&result.message_block());????{???ACE_Guard<ACE_Recursive_Thread_Mutex>?locker?(_lock);???_io_count--;??}??check_destroy?();??}??????????????????????int??ClientHandler::initiate_read_stream??(void)??{??ACE_Guard<ACE_Recursive_Thread_Mutex>?locker?(_lock);????????if?(_rs.read?(_read_msg_block,?_read_msg_block.space())?==?-1)??{???ACE_ERROR_RETURN?((LM_ERROR,"%p/n","ACE_Asynch_Read_Stream::read"),-1);??}??_io_count++;??return?0;??}???????????int??ClientHandler::initiate_write_stream?(ACE_Message_Block?&?mb,?size_t?nBytes?)??{??ACE_Guard<ACE_Recursive_Thread_Mutex>?locker?(_lock);??if?(_ws.write?(mb?,?nBytes?)?==?-1)??{???mb.release?();???ACE_ERROR_RETURN((LM_ERROR,"%p/n","ACE_Asynch_Write_File::write"),-1);??}??_io_count++;??return?0;??}????void?ClientHandler::open?(ACE_HANDLE?handle,ACE_Message_Block?&message_block)??{????_last_net_io=ACE_OS::time(NULL);??_io_count=0;??if(_ws.open(*this,this->handle())==-1)??{???ACE_ERROR?((LM_ERROR,"%p/n","ACE_Asynch_Write_Stream::open"));??}??else?if?(_rs.open?(*this,?this->handle())?==?-1)??{???ACE_ERROR?((LM_ERROR,"%p/n","ACE_Asynch_Read_Stream::open"));??}??else??{???initiate_read_stream?();??}????check_destroy();????}????void?ClientHandler::fini()??{??}????void?ClientHandler::check_time_out(time_t?cur_time)??{??????????if(this->handle()==ACE_INVALID_HANDLE)???return;??if(cur_time-_last_net_io>CLIENT_TIME_OUT_SECONDS)??{???ACE_OS::shutdown(this->handle(),SD_BOTH);???ACE_OS::closesocket(this->handle());???this->handle(ACE_INVALID_HANDLE);??}??}????int?ClientHandler::check_destroy()??{??{???ACE_Guard<ACE_Recursive_Thread_Mutex>?locker?(_lock);???if?(_io_count>?0)????return?1;??}??ACE_OS::shutdown(this->handle(),SD_BOTH);??ACE_OS::closesocket(this->handle());??this->handle(ACE_INVALID_HANDLE);????????ClientManager::get_instance().release_client_handle(this);????return?0;??}???????????這個也很好!ACE的好文!真是不轉我覺得后悔啊!??沒啥好說的,管理所有的客戶端和內存池的功能。????class?ClientManager?:?public?SingleTon<ClientManager>??{??public:????ClientManager():_header(NULL){}????~ClientManager(){}????public:????void?init(unsigned?int?default_pool_size,unsigned?int?default_read_buf_size);????void?fini();????public:????ClientHandler?*get_clienthandler();????void?release_client_handle(ClientHandler?*client);????void?check_time_out();????size_t?get_client_count();????private:????ClientHandler?*_header;????std::set<ClientHandler?*>?_active_clients;????ACE_Recursive_Thread_Mutex?_lock;??};??????????????#include?"clientmanager.h"??#include?<ace/Guard_T.h>????ClientHandler?*ClientManager::get_clienthandler()??{??FUNC_ENTER;??ACE_Guard<ACE_Recursive_Thread_Mutex>?locker(_lock);??ClientHandler?*ret=NULL;??if(_header==NULL)??{???ACE_DEBUG((LM_DEBUG,"client?>?max?clients!!!/n"));??}??else??{???ret=_header;???_header=_header->next();???ret->init();???_active_clients.insert(ret);??}??FUNC_LEAVE;??return?ret;??}????void?ClientManager::release_client_handle(ClientHandler?*client)??{????ACE_Guard<ACE_Recursive_Thread_Mutex>?locker(_lock);??client->fini();??client->next(_header);??_header=client;??_active_clients.erase(client);????}????void?ClientManager::init(unsigned?int?default_pool_size,unsigned?int?default_read_buf_size)??{????for(unsigned?int?i=0;i<default_pool_size;i++)??{???ClientHandler?*client=new?ClientHandler(default_read_buf_size);???client->next(_header);???_header=client;??}????}????void?ClientManager::fini()??{????while(_header)??{???ClientHandler?*temp=_header->next();???delete?_header;???_header=temp;??}????}????void?ClientManager::check_time_out()??{??time_t?cur_time=ACE_OS::time(NULL);??ACE_Guard<ACE_Recursive_Thread_Mutex>?locker(_lock);??for(std::set<ClientHandler?*>::iterator?it=_active_clients.begin();it!=_active_clients.end();it++)??{???(*it)->check_time_out(cur_time);??}??}????size_t?ClientManager::get_client_count()??{??ACE_Guard<ACE_Recursive_Thread_Mutex>?locker(_lock);??return?_active_clients.size();??}????????按照七貓的說話,這個框架可以達到IOCP的效率,真的利害!但是我也不知道真偽!所以大家不要認為是我說的阿!我沒有測試過,所以也不太清楚是否真的有那么高的效率!??沒有什么可說的!?好文章!????class?MyServer?:?public?SingleTon<MyServer?>??{??public:??????????int?init(const?char?*listenaddr,unsigned?int?numOfThreads);????????void?fini();?????????int?start();????????void?stop();??private:????ServerTask?_task;????ACE_INET_Addr?_listen_addr;????ClientAcceptor?_acceptor;????unsigned?int?_num_of_threads;??private:?????????Observer?_observer;??????CheckClientTimeoutHandler?_check_time_out_handler;??};??????int?MyServer::init(const?char?*listenaddr,unsigned?int?numOfThreads)??{????????_listen_addr=ACE_INET_Addr(listenaddr);????_num_of_threads=1;??_observer.init();??_syn_cms_handler.init();??_check_time_out_handler.init();??return?1;??}????void?MyServer::fini()??{??ItemManager::get_instance().purge_all_items();??_observer.fini();??_syn_cms_handler.fini();??_check_time_out_handler.fini();??}?????????int?MyServer::start()??{??int?Rc?=?_acceptor.open?(_listen_addr,0,1);??if(Rc==-1)??{???ACE_ERROR_RETURN?((LM_ERROR,?"acceptor?error./n"),?-1);??}?????????????ACE_Time_Value?check_client_timeout_interval(120);??Rc=ACE_Proactor::instance?()->schedule_timer?(???_check_time_out_handler,???(void?*)?"timeout",???ACE_Time_Value::zero,???check_client_timeout_interval);??if(Rc==-1)??{???ACE_ERROR_RETURN?((LM_ERROR,?"%p/n",?"check_client_timeout?schedule_timer"),?-1);??}????ACE_Time_Value?observertime(20);??Rc=ACE_Proactor::instance?()->schedule_timer?(???_observer,???(void?*)?"observer",???ACE_Time_Value::zero,???observertime);??if(Rc==-1)??{???ACE_ERROR_RETURN?((LM_ERROR,?"%p/n",?"observer?schedule_timer"),?-1);??}????if?(_task.activate?(THR_NEW_LWP,?_num_of_threads?)?==?-1)??{???ACE_ERROR_RETURN?((LM_ERROR,?"task?start?error./n",?"main"),?-1);??}??return?1;??}??????void?MyServer::stop()??{??ACE_Proactor::end_event_loop?()?;??ACE_Thread_Manager?*?pTM?=?ACE_Thread_Manager::instance();????pTM->wait_task?(?&?_task)?;????}??????int?ACE_TMAIN(int?argc,char?*argv[])??{??FUNC_ENTER;???std::cout<<"size?of?item?is?"<<sizeof(Item)<<std::endl;??????ACE_LOG_MSG->open?(argv[0],ACE_Log_Msg::OSTREAM);??????????ACE_DEBUG((LM_DEBUG,"read?config?file?from?%s/n",SERVER_CONFIG_FILE));??XMLConfig::get_instance().read_config_from_xml_file(SERVER_CONFIG_FILE);????????ACE_DEBUG((LM_DEBUG,"starting?init?MsgBlockManager.../n"));??MsgBlockManager::get_instance().init(XMLConfig::get_instance().get_num_of_msg_blocks(),XMLConfig::get_instance().get_size_of_write_msg_blocks());??????ACE_DEBUG((LM_DEBUG,"starting?init?ClientManager.../n"));??ClientManager::get_instance().init(XMLConfig::get_instance().get_num_of_clients(),XMLConfig::get_instance().get_size_of_client_read_buf());???????????????ACE_DEBUG((LM_DEBUG,"starting?init?MyServer.../n"));??MyServer::get_instance().init(XMLConfig::get_instance().get_listen_addr(),XMLConfig::get_instance().get_num_of_proactor_threads());????ACE_DEBUG((LM_DEBUG,"starting?MyServer.../n"));??MyServer::get_instance().start();??ACE_DEBUG((LM_DEBUG,"Enter?looping.../n"));????while(true)??{???std::cout?<<?"Input?Command=>/n"?<<?std::flush?;???std::string?inputcmd;???std::getline(std::cin,inputcmd);???if(!handle_console_cmd(inputcmd))????break;??}????????????MyServer::get_instance().stop();??MsgBlockManager::get_instance().fini();??ClientManager::get_instance().fini();??return?1;??}??
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的ACE proactor example的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。