[ACE程序员教程笔记]使用Reactor实现Accept和数据读取

    技术2022-06-27  84

    ACE_Reactor实现了操作系统多路复用和应用层事件处理。本文例子程序实现Acceptor事件和输入事件两个处理类,两个处理类均采用手动的方式进行卸载处理对象。 Acceptor事件处理类,此类监听ACCEPT事件,当有客户端的连接请求时,触发handle_input函数,在此函数中将创建输入事件对象,并进行注册。 /* *处理客户端的连接请求 */ class AcceptHandler : public ACE_Event_Handler { public: AcceptHandler(ACE_Addr& addr) { this->open(addr); } int open(ACE_Addr& addr) { m_saAcceptor.open(addr); return 0; } //处理客户端的连接请求 int handle_input(ACE_HANDLE fd /* = ACE_INVALID_HANDLE */) { ACE_DEBUG((LM_DEBUG,ACE_TEXT("AcceptHandler!/n"))); ReadHandler* pRh = new ReadHandler; if(m_saAcceptor.accept(pRh->GetStream(),0,0,1) == -1) { ACE_ERROR((LM_ERROR,ACE_TEXT("accept error!/n"))); return 0; } ACE_Reactor::instance()->register_handler(pRh,ACE_Event_Handler::READ_MASK); //采用-1作为返回值,不要卸载Acceptor事件处理 return 0; } //一定要实现这个函数 ACE_HANDLE get_handle() const { return m_saAcceptor.get_handle(); } private: ACE_SOCK_Acceptor m_saAcceptor; }; Read事件处理类,此类负责读取来自客户端发送的文本数据,并将接收到的输入显示到输出设备。 #include "stdafx.h" #include "ace/Reactor.h" #include "ace/Event_Handler.h" #include "ace/Addr.h" #include "ace/Sock_Acceptor.h" #define MSG_LEN 11 /* *数据读取数据处理函数 */ class ReadHandler : public ACE_Event_Handler { public: //接收来自客户端的数据 int handle_input(ACE_HANDLE fd /* = ACE_INVALID_HANDLE */) { memset(m_szMsg,0,MSG_LEN); m_ssStream.recv_n(m_szMsg,MSG_LEN - 1); ACE_DEBUG((LM_DEBUG,ACE_TEXT("%s/n"),m_szMsg)); //返回值为0,不要卸载读取事件处理 return 0; } //提供读句柄 ACE_HANDLE get_handle()const { return m_ssStream.get_handle(); } //获得当前的Stream ACE_SOCK_Stream& GetStream() { return m_ssStream; } private: ACE_SOCK_Stream m_ssStream; char m_szMsg[MSG_LEN]; }; 测试程序只注册了Accept事件处理类,进入事件循环。

    int ACE_TMAIN(int argc, ACE_TCHAR* argv[]) { ACE_INET_Addr addr(27002); AcceptHandler ah(addr); ACE_Reactor::instance()->register_handler(&ah, ACE_Event_Handler::ACCEPT_MASK); while(1) { ACE_Reactor::instance()->handle_events(); } return 0; }


    最新回复(0)