与ACE_Acceptor相同,它实现的是连接与数据处理的分离。同样也是继承于ACE_Svc_Handler类,当连接成功后,Reactor会自动的回调open方法,注意本例中的SvcHandle与Acceptor中的事件处理是相同的,所修改的只是连接部分,这恰恰说明了连接与数据处理分离的优点。
#include "stdafx.h" #include "ace/Connector.h" #include "ace/Reactor.h" #include "ace/Svc_Handler.h" #include "ace/SOCK_Acceptor.h" #include "ace/Synch.h" #include "ace/Acceptor.h" #include "ace/SOCK_Connector.h" #define BUF_LEN 11 /* *用于连接发送 *当与服务器程序连接请求建立时,open方法将会被回调执行 */ class SvcHandler : public ACE_Svc_Handler<ACE_SOCK_STREAM,ACE_NULL_SYNCH> { public: int open(void*) { ACE_DEBUG((LM_DEBUG,ACE_TEXT("connection established/n"))); //注册输入处理回调函数 ACE_Reactor::instance()->register_handler(this, ACE_Event_Handler::READ_MASK); return 0; } //接收来自服务器发送的数据 int handle_input(ACE_HANDLE fd /* = ACE_INVALID_HANDLE */) { memset(m_szMsg,0,BUF_LEN); peer().recv_n(m_szMsg,BUF_LEN - 1); ACE_DEBUG((LM_DEBUG,ACE_TEXT("%s/n"),m_szMsg)); return 0; } private: char m_szMsg[BUF_LEN]; }; //连接器类型创建 typedef ACE_Connector<SvcHandler,ACE_SOCK_CONNECTOR> Connector; int ACE_TMAIN(int argc, ACE_TCHAR* argv[]) { //指定连接的服务器和端口号 ACE_INET_Addr iaRemote(27002,"localhost"); SvcHandler* pSvcHandler = new SvcHandler; Connector c; //连接服务器 if(c.connect(pSvcHandler,iaRemote) == -1) { ACE_DEBUG((LM_DEBUG,ACE_TEXT("connect error!/n"))); return -1; } while (1) { ACE_Reactor::instance()->handle_events(); } return 0; }