`

ACE Reactor的Echo Server

阅读更多
相对完整的修改版本

<!---->  1 /************************************************************************ 
  2 * @file: echo.cpp                                                    
  3 * @author: dennis
  4 * @revise: dennis <killme2008@gmail.com> http://www.blogjava.net/killme2008
  5 *          相对完整的echo server,可以接受多个客户端连接,并且可以通过键入quit正常关闭
  6 
  7 ************************************************************************/
  8 
  9 #ifdef _DEBUG
 10 #pragma comment (lib,"aced.lib")
 11 #else
 12 #pragma comment (lib,"ace.lib")
 13 #endif
 14 
 15 #include "ace/Reactor.h"
 16 #include "ace/SOCK_Acceptor.h"
 17 #include "ace/os.h"
 18 #include "ace/Log_Msg.h"
 19 #include "ace/inet_addr.h"
 20 #include "ace/Thread_Manager.h"
 21 #include<iostream>
 22 #include<string>
 23 
 24 #define PORT_NO 8080
 25 typedef ACE_SOCK_Acceptor Acceptor;
 26 //forward declaration
 27 class Echo_Handler;
 28 
 29 class Echo_Handler:public ACE_Event_Handler
 30 {
 31 public:
 32     //construcor
 33     Echo_Handler()
 34     {
 35     }
 36     virtual ~Echo_Handler()
 37     {
 38     }
 39     //Called back to handle any input received
 40     int handle_input(ACE_HANDLE)
 41     {
 42         //receive the data
 43         ssize_t recvBytes = peer().recv(data,12);
 44         if(recvBytes <= 0)
 45         {
 46             ACE_DEBUG((LM_DEBUG,"%s\n","客户端断开连接"));
 47             return -1;
 48         }
 49         data[recvBytes] = 0;
 50 
 51         ACE_DEBUG((LM_DEBUG,"%s\n",data));
 52 
 53 
 54         if(ACE_OS::strcmp(data,"q"== 0)
 55         {
 56             ACE_DEBUG((LM_DEBUG,"%s\n","客户端退出"));
 57             peer().close();
 58             return -1;
 59         }
 60         peer().send_n(data,recvBytes);
 61         // do something with the input received.
 62         // 
 63         // keep yourself registerd with the reator
 64         return 0;
 65     }
 66 
 67     int handle_close(ACE_HANDLE h,ACE_Reactor_Mask m)
 68     {
 69         delete this;
 70         return  0;
 71     }
 72 
 73     //Used by the reactor to determine the underlying handle
 74     ACE_HANDLE get_handle()  const 
 75     {
 76         return this->peer_.get_handle();
 77     }
 78 
 79     //Returns a reference to the underlying stream.
 80     ACE_SOCK_Stream& peer()
 81     {
 82         return this->peer_;
 83     }
 84 
 85 private:
 86     ACE_SOCK_Stream peer_;
 87     char data [12];
 88 };
 89 
 90 class Echo_Accept_Handler:public ACE_Event_Handler
 91 {
 92 public:
 93     //Constructor
 94     Echo_Accept_Handler(ACE_Addr &addr)
 95     {
 96         this->open(addr);
 97     }
 98     virtual ~Echo_Accept_Handler(){}
 99     //Open the peer_acceptor so it starts to "listen"
100     //for incoming clients
101     int open(ACE_Addr &addr)
102     {
103         if(peer_acceptor.open(addr)==-1)
104             ACE_ERROR_RETURN((LM_ERROR,"启动服务器错误\n"),1);
105         return 0;
106     }
107 
108     //Overload the handle input method
109     int handle_input(ACE_HANDLE handle)
110     {
111         //Client has requested connection to server.
112         //Create a handler to handle the connection
113         Echo_Handler *eh;
114         ACE_NEW_RETURN(eh,Echo_Handler,-1);
115         ACE_INET_Addr cliaddr;
116         //Accept the connection "into" the Event Handler
117         if(this->peer_acceptor.accept(eh->peer(),//stream
118             &cliaddr,//remote address
119             0,//timeout
120             1== -1)//restart if interrupted
121             ACE_DEBUG((LM_ERROR,"Error in connection \n"));
122 
123         ACE_DEBUG((LM_DEBUG,"连接已经建立,来自%s\n",cliaddr.get_host_addr()));
124 
125         //Register the input event handler for reading 
126         ACE_Reactor::instance()->register_handler(eh,ACE_Event_Handler::READ_MASK);
127         const char* msg = "按q键使服务安全退出\r\n";
128         eh->peer().send_n(msg,strlen(msg)+1);
129         return 0;
130     }
131 
132     //Used by the reactor to determine the underlying handle
133     ACE_HANDLE get_handle(voidconst
134     {
135         return this->peer_acceptor.get_handle();
136     }
137     int handle_close(ACE_HANDLE h,ACE_Reactor_Mask m){
138         peer_acceptor.close();
139         delete this;
140         return 0;
141     }
142 
143 private:
144     Acceptor peer_acceptor;
145 };
146 class Quit_Handler:public ACE_Event_Handler
147 {
148 public:
149     Quit_Handler(ACE_Reactor* r):ACE_Event_Handler(r){}
150     virtual int handle_exception(ACE_HANDLE)
151     {
152         ACE_DEBUG((LM_DEBUG,"停止服务器中\n"));
153         reactor()->end_reactor_event_loop();
154         return -1;
155     }
156     int handle_close(ACE_HANDLE h,ACE_Reactor_Mask m)
157     {
158         delete this;
159         return 0;
160     }
161     virtual ~Quit_Handler(){}
162 };
163 static ACE_THR_FUNC_RETURN run_events (void *arg);
164 static ACE_THR_FUNC_RETURN controller (void *arg);
165 int ACE_TMAIN(int argc,char *argv[])
166 {
167 
168     ACE_Reactor* reactor=ACE_Reactor::instance();
169     if(ACE_Thread_Manager::instance()->spawn(run_events,reactor,THR_DETACHED | THR_SCOPE_SYSTEM)==-1)
170         return 1;
171     if(ACE_Thread_Manager::instance()->spawn(controller,reactor,THR_DETACHED | THR_SCOPE_SYSTEM)==-1)
172         return 1;
173     return ACE_Thread_Manager::instance()->wait();
174 }
175 
176 static ACE_THR_FUNC_RETURN run_events (void *arg)
177 {
178     ACE_Reactor* reactor=ACE_static_cast(ACE_Reactor*,arg);
179     ACE_INET_Addr addr(PORT_NO);
180 
181     Echo_Accept_Handler *eh=0;
182     ACE_NEW_RETURN(eh,Echo_Accept_Handler(addr),1);
183 
184     ACE_Reactor::instance()->owner(ACE_OS::thr_self());
185     reactor->register_handler(eh,ACE_Event_Handler::ACCEPT_MASK);
186     ACE_Reactor::instance()->run_reactor_event_loop();
187     return 0;
188 }
189 static ACE_THR_FUNC_RETURN controller (void *arg)
190 {
191     ACE_Reactor* reactor=ACE_static_cast(ACE_Reactor*,arg);
192     Quit_Handler *quit_handler=0;
193     ACE_NEW_RETURN(quit_handler,Quit_Handler(reactor),1);
194     for(;;)
195     {
196         std::string line;
197         std::getline(std::cin,line,'\n');
198         if(line=="quit"){
199             ACE_DEBUG((LM_DEBUG,"请求停止服务器\n"));
200             reactor->notify(quit_handler);
201             break;
202         }
203     }
204     return 0;  
205 }
206 


分享到:
评论

相关推荐

    ACE_Reactor.rar_ACE reactor_ACE_React_ACE_Reactor_reactor

    ACE Reactor是ACE库中的核心组件之一,它是事件驱动设计模式的一种实现,用于处理并发事件。在这个“ACE_Reactor.rar”压缩包中,包含的可能是关于如何使用ACE Reactor来构建服务器端程序的相关资料。 首先,我们来...

    ACE Reactor服务端简单范例

    在"Reactor_Server"这个文件中,我们可以预期包含以下关键步骤: 1. 创建`ACE_Reactor`实例。 2. 创建监听套接字并绑定到特定的IP地址和端口。 3. 将监听套接字注册到Reactor,指定当有新连接到达时的处理函数。 4. ...

    The Design and Use of the ACE Reactor

    ### ACE Reactor的设计与应用 #### 一、引言 本文档主要介绍ACE框架中的Reactor模式设计与实现。Reactor模式主要用于处理并发服务请求,这些请求由一个或多个客户端发送到应用程序。每个应用程序的服务通过独立的...

    ACE Reactor相关的知识

    ACE Reactor 模型是 ACE (Adaptive Communication Environment) 库中的核心组件,它是一种事件驱动的编程模型,主要用于网络编程。Reactor 提供了一种高效的方法来处理多个并发的 I/O 事件,使得服务器能够有效地...

    ACE Reactor 和proactor 通信方式两套代码

    本人学习ACE 时候写的关于两种通信方式的实例代码,我把三个连写都写在了一个文件,根据需要注释掉其他的就行。 ACE用于开发通信程序非常方便,尤其相对于WinSock 来说,可以省很多代码,普通程序员也更容易理解

    ACE_server.rar_ACE server_ACE tcp_ACE_SERVER_ACE框架_ace server cl

    2. `ACE_Reactor`:管理事件,如I/O完成、定时器触发等,采用非阻塞I/O模型。 3. `ACE_Svc_Handler`:处理具体的业务逻辑,继承自`ACE_Event_Handler`,实现读写回调函数。 4. `ACE_Thread_Manager`:用于管理线程,...

    ACE通用服务器ace server

    "ACE通用服务器ace server"是一个基于ACE库构建的服务器架构,它涵盖了两种核心的设计模式:Reactor和Proactor。这两个模式在并发编程和网络服务领域中具有重要地位,特别是对于高性能、高并发的服务器开发至关重要...

    ace_reactor:王牌React堆服务器

    Ace Reactor是一个基于Ace库开发的高性能网络反应堆,它被设计用于构建高效、可扩展的网络服务。Ace是AT&T实验室开发的一个跨平台、事件驱动的C++网络编程框架,而Ace Reactor是其核心组件,用于处理异步事件和网络I...

    ACE_server.rar_ACE server

    4. **启动服务器**: 通过调用ACE_Reactor的register_handler()函数注册服务处理程序,并调用ACE_SOCK_Acceptor::accept()开始监听连接。 5. **客户端连接**: 客户端使用ACE_SOCK_Connector类尝试连接到服务器。连接...

    ACE反应器(Reactor)模式的深入分析

    ACE反应器(Reactor)模式是一种用于处理并发事件的架构设计模式,主要应用于网络服务器的开发,特别是处理大量并发连接的场景。它有效地解决了在单线程或多线程环境中,如何高效地处理多个I/O事件的问题。Reactor模式...

    ACE资料系列 - ACE中设计模式

    在 ACE 框架中,还有其他类型的 Reactor,例如 ACE_Dev_Poll_Reactor 和 ACE_TP_Reactor。 4. Bridge 模式的优点 Bridge 模式的优点在于,它可以使得抽象部分和实现部分独立地变化,提高了系统的灵活性和可维护性...

    linux下ACE简单封装的SERVER和CLIENT类

    在ACE库中,服务器端通常使用`ACE_SVC_Handler`或`ACE_Reactor`模式来处理客户端的连接请求。在这个封装中,SERVER类可能是基于这些基础组件构建的,它可能包含了监听套接字、接收连接请求、创建新的服务处理对象...

    reactor-netty, TCP/HTTP/UDP 客户机/服务器,带有联网的反应器.zip

    reactor-netty, TCP/HTTP/UDP 客户机/服务器,带有联网的反应器 反应器联网 http://projectreactor.io/docs/netty/release/api/在软件许可证 2.0许可,,,。

    ACE开发指南(初级).

    ##### 3.3 ACE Reactor Server(Demo) 接下来我们来看一个简单的ACE Reactor服务器示例。 ###### 3.3.1 需求 实现一个简单的文本聊天服务器,能够同时处理多个客户端的连接请求。 ###### 3.3.2 实现 首先定义一个...

    ACE摘录&总结

    在实践中,例如创建一个ACE Reactor Server,需要准备头文件和库文件路径,然后创建一个继承自`ACE_Svc_Handler`的ServerHandler类,覆盖`handle_input`方法。接着实现cpp代码并在main函数中启动服务。 与Reactor...

    ACE框架知识

    - **reactor(ACE_Reactor*)**: 设置与此事件处理器关联的`ACE_Reactor`实例。 - **reactor()**: 获取当前关联的`ACE_Reactor`实例。 ##### 3. 事件掩码 - **READ_MASK**: 表示读就绪事件。 - **WRITE_MASK**: ...

    .NET Reactor 4.9 破解版

    .NET Reactor是一款功能强大的代码保护以及许可授权管理系统软件,主要用于开发人员保护其.NET软件程序,.NET Reactor支持所有支持.NET编译的程序开发语言。 .NET Reactor 4.9是目前最新版本,由大神yoza破解,亲测...

    C++源代码《用ACE实现可靠消息传送》MQServer.exe、MQClient程序小实例

    本文将深入探讨如何使用ACE(Adaptive Communication Environment)库来实现这一功能,同时以"C++源代码《用ACE实现可靠消息传送》MQServer.exe、MQClient程序小实例"为例进行详细解析。 ACE是一个跨平台的C++框架...

    ace技术内幕示例代码

    6. **I/O复用**:ACE通过`ACE_Select_Reactor`或`ACE_Proactor`实现了异步I/O,利用了如epoll或kqueue这样的系统调用来提高性能。 7. **对象适配器**:ACE的对象适配器如`ACE_Service_Object`和`ACE_Svc_Handler`,...

Global site tag (gtag.js) - Google Analytics