前端之家收集整理的这篇文章主要介绍了
(ACE)Reactor反应器装载多种事件处理器,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
#include "ace/Reactor.h" #include "ace/SOCK_Acceptor.h" #define PORT_NO 19998 typedef ACE_SOCK_Acceptor Acceptor; //forward declaration class My_Accept_Handler; //数据处理器 class My_Input_Handler: public ACE_Event_Handler { public: //构造
方法 My_Input_Handler() { ACE_DEBUG((LM_DEBUG,"Constructor\n")); } //回调任何从句柄来的数据 int handle_input(ACE_HANDLE) { //获得数据 peer_i().recv_n(data,12); ACE_DEBUG((LM_DEBUG,"%s\n",data)); //事件处理区 return 0; } //必须有的,传给handle_input的句柄 ACE_HANDLE get_handle(void) { return this->peer_i().get_handle(); } ACE_SOCK_Stream &peer_i() { return this->peer_; } private: ACE_SOCK_Stream peer_; //事件处理I/O入口,缓冲区 char data [12]; }; //接受处理器 class My_Accept_Handler: public ACE_Event_Handler { public: //构造 My_Accept_Handler(ACE_Addr &addr) { this->open(addr); } //开始监听 //接受来自客户端的请求 int open(ACE_Addr &addr) { peer_acceptor.open(addr); return 0; } //重载I/O处理区,client来处理 int handle_input(ACE_HANDLE handle) { //已经来了一个client,创建数据处理器实例去处理 My_Input_Handler *eh= new My_Input_Handler(); //Accept the connection "into" the Event Handler if (this->peer_acceptor.accept (eh->peer_i(),// 流对象 0,// 远程地址 0,// timeout 1) ==-1) //restart if interrupted ACE_DEBUG((LM_ERROR,"Error in connection\n")); ACE_DEBUG((LM_DEBUG,"Connection established\n")); // 把该处理器绑定到单体反应器 中 ACE_Reactor::instance()->register_handler(eh,ACE_Event_Handler::READ_MASK); //如果你想处理更多的客户端就返回 -1,如果想永久多个客户端,返回 0 return 0; } //必须有的,传给handle_input的句柄 ACE_HANDLE get_handle(void) const { return this->peer_acceptor.get_handle(); } private: Acceptor peer_acceptor; }; int main(int argc,char * argv[]) { ACE_INET_Addr addr(PORT_NO); My_Accept_Handler *eh=new My_Accept_Handler(addr); ACE_Reactor::instance()->register_handler(eh,ACE_Event_Handler::ACCEPT_MASK); while(1) ACE_Reactor::instance()->handle_events(); }
原文链接:https://www.f2er.com/react/308516.html