ACE Reactor的Echo Server

前端之家收集整理的这篇文章主要介绍了ACE Reactor的Echo Server前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
2009 - 02 - 03

ACE Reactor的Echo Server

相对完整的修改版本

1 /* ***********************************************************************
2 *@file:echo.cpp
3 *@author:dennis
4 *@revise:dennis<killme2008@gmail.com> http://www.blogjava.net/killme2008
5 *相对完整的echoserver,可以接受多个客户端连接,并且可以通过键入quit正常关闭
6
7 *********************************************************************** */ @H_403_63@
8 @H_403_63@
9 @H_403_63@#ifdef_DEBUG
10 @H_403_63@#pragmacomment(lib, @H_403_63@" @H_403_63@aced.lib @H_403_63@" @H_403_63@)
11 #else @H_403_63@
12 @H_403_63@#pragmacomment(lib, @H_403_63@" @H_403_63@ace.lib @H_403_63@" @H_403_63@)
13 #endif @H_403_63@
14 @H_403_63@
15 @H_403_63@#include @H_403_63@" @H_403_63@ace/Reactor.h @H_403_63@" @H_403_63@
16 @H_403_63@#include @H_403_63@" @H_403_63@ace/SOCK_Acceptor.h @H_403_63@" @H_403_63@
17 @H_403_63@#include @H_403_63@" @H_403_63@ace/os.h @H_403_63@" @H_403_63@
18 @H_403_63@#include @H_403_63@" @H_403_63@ace/Log_Msg.h @H_403_63@" @H_403_63@
19 @H_403_63@#include @H_403_63@" @H_403_63@ace/inet_addr.h @H_403_63@" @H_403_63@
20 @H_403_63@#include @H_403_63@" @H_403_63@ace/Thread_Manager.h @H_403_63@" @H_403_63@
21 @H_403_63@#include @H_403_63@< @H_403_63@iostream @H_403_63@> @H_403_63@
22 @H_403_63@#include @H_403_63@< string @H_403_63@> @H_403_63@
23 @H_403_63@
24 #define @H_403_63@PORT_NO 8080 @H_403_63@
25 @H_403_63@typedefACE_SOCK_AcceptorAcceptor;
26 // forwarddeclaration
27 class @H_403_63@Echo_Handler;
28 @H_403_63@
29 class @H_403_63@Echo_Handler: public @H_403_63@ACE_Event_Handler
30 @H_403_63@{
31 public @H_403_63@:
32 @H_403_63@ // construcor
33 @H_403_63@Echo_Handler()
34 @H_403_63@{
35 @H_403_63@}
36 @H_403_63@ virtual @H_403_63@ @H_403_63@~ @H_403_63@Echo_Handler()
37 @H_403_63@{
38 @H_403_63@}
39 @H_403_63@ // Calledbacktohandleanyinputreceived
40 @H_403_63@ int @H_403_63@handle_input(ACE_HANDLE)
41 @H_403_63@{
42 @H_403_63@ // receivethedata
43 @H_403_63@ssize_trecvBytes @H_403_63@= @H_403_63@peer().recv(data, @H_403_63@12 @H_403_63@);
44 @H_403_63@ if @H_403_63@(recvBytes @H_403_63@<= @H_403_63@ @H_403_63@0 @H_403_63@)
45 @H_403_63@{
46 @H_403_63@ACE_DEBUG((LM_DEBUG, @H_403_63@" @H_403_63@%s/n @H_403_63@" @H_403_63@, @H_403_63@" @H_403_63@客户端断开连接 @H_403_63@" @H_403_63@));
47 @H_403_63@ return @H_403_63@ @H_403_63@- @H_403_63@1 @H_403_63@;
48 @H_403_63@}
49 @H_403_63@data[recvBytes] @H_403_63@= @H_403_63@ @H_403_63@0 @H_403_63@;
50 @H_403_63@
51 @H_403_63@ACE_DEBUG((LM_DEBUG,data));
52 @H_403_63@
53 @H_403_63@
54 @H_403_63@ if @H_403_63@(ACE_OS::strcmp(data, @H_403_63@" @H_403_63@q @H_403_63@" @H_403_63@) @H_403_63@== @H_403_63@ @H_403_63@0 @H_403_63@)
55 @H_403_63@{
56 @H_403_63@ACE_DEBUG((LM_DEBUG, @H_403_63@" @H_403_63@客户端退出 @H_403_63@" @H_403_63@));
57 @H_403_63@peer().close();
58 @H_403_63@ return @H_403_63@ @H_403_63@- @H_403_63@1 @H_403_63@;
59 @H_403_63@}
60 @H_403_63@peer().send_n(data,recvBytes);
61 @H_403_63@ // dosomethingwiththeinputreceived.
62 //
63 // keepyourselfregisterdwiththereator
64 @H_403_63@ return @H_403_63@ @H_403_63@0 @H_403_63@;
65 @H_403_63@}
66 @H_403_63@
67 @H_403_63@ int @H_403_63@handle_close(ACE_HANDLEh,ACE_Reactor_Maskm)
68 @H_403_63@{
69 @H_403_63@delete this @H_403_63@;
70 @H_403_63@ return @H_403_63@ @H_403_63@0 @H_403_63@;
71 @H_403_63@}
72 @H_403_63@
73 @H_403_63@ // Usedbythereactortodeterminetheunderlyinghandle
74 @H_403_63@ACE_HANDLEget_handle() const @H_403_63@
75 @H_403_63@{
76 @H_403_63@ return @H_403_63@ this @H_403_63@-> @H_403_63@peer_.get_handle();
77 @H_403_63@}
78 @H_403_63@
79 @H_403_63@ // Returnsareferencetotheunderlyingstream.
80 @H_403_63@ACE_SOCK_Stream @H_403_63@& @H_403_63@peer()
81 @H_403_63@{
82 @H_403_63@ return @H_403_63@ this @H_403_63@-> @H_403_63@peer_;
83 @H_403_63@}
84 @H_403_63@
85 private @H_403_63@:
86 @H_403_63@ACE_SOCK_Streampeer_;
87 @H_403_63@ char @H_403_63@data[ @H_403_63@12 @H_403_63@];
88 @H_403_63@};
89 @H_403_63@
90 class @H_403_63@Echo_Accept_Handler: public @H_403_63@ACE_Event_Handler
91 @H_403_63@{
92 public @H_403_63@:
93 @H_403_63@ // Constructor
94 @H_403_63@Echo_Accept_Handler(ACE_Addr @H_403_63@& @H_403_63@addr)
95 @H_403_63@{
96 @H_403_63@ this @H_403_63@-> @H_403_63@open(addr);
97 @H_403_63@}
98 @H_403_63@ virtual @H_403_63@ @H_403_63@~ @H_403_63@Echo_Accept_Handler(){}
99 @H_403_63@ // Openthepeer_acceptorsoitstartsto"listen"
100 // forincomingclients
101 @H_403_63@ int @H_403_63@open(ACE_Addr @H_403_63@& @H_403_63@addr)
102 @H_403_63@{
103 @H_403_63@ if @H_403_63@(peer_acceptor.open(addr) @H_403_63@==- @H_403_63@1 @H_403_63@)
104 @H_403_63@ACE_ERROR_RETURN((LM_ERROR, @H_403_63@" @H_403_63@启动服务器错误/n @H_403_63@" @H_403_63@), @H_403_63@1 @H_403_63@);
105 @H_403_63@ return @H_403_63@ @H_403_63@0 @H_403_63@;
106 @H_403_63@}
107 @H_403_63@
108 @H_403_63@ // Overloadthehandleinputmethod
109 @H_403_63@ int @H_403_63@handle_input(ACE_HANDLEhandle)
110 @H_403_63@{
111 @H_403_63@ // Clienthasrequestedconnectiontoserver.
112 // Createahandlertohandletheconnection
113 @H_403_63@Echo_Handler @H_403_63@* @H_403_63@eh;
114 @H_403_63@ACE_NEW_RETURN(eh,Echo_Handler, @H_403_63@- @H_403_63@1 @H_403_63@);
115 @H_403_63@ACE_INET_Addrcliaddr;
116 @H_403_63@ // Accepttheconnection"into"theEventHandler
117 @H_403_63@ if @H_403_63@( this @H_403_63@-> @H_403_63@peer_acceptor.accept(eh @H_403_63@-> @H_403_63@peer(), // stream
118 @H_403_63@ @H_403_63@& @H_403_63@cliaddr, // remoteaddress
119 @H_403_63@ @H_403_63@0 @H_403_63@, // timeout
120 @H_403_63@ @H_403_63@1 @H_403_63@) @H_403_63@== @H_403_63@ @H_403_63@- @H_403_63@1 @H_403_63@) // restartifinterrupted
121 @H_403_63@ACE_DEBUG((LM_ERROR, @H_403_63@" @H_403_63@Errorinconnection/n @H_403_63@" @H_403_63@));
122 @H_403_63@
123 @H_403_63@ACE_DEBUG((LM_DEBUG, @H_403_63@" @H_403_63@连接已经建立,来自%s/n @H_403_63@" @H_403_63@,cliaddr.get_host_addr()));
124 @H_403_63@
125 @H_403_63@ // Registertheinputeventhandlerforreading
126 @H_403_63@ACE_Reactor::instance() @H_403_63@-> @H_403_63@register_handler(eh,ACE_Event_Handler::READ_MASK);
127 @H_403_63@ const @H_403_63@ char @H_403_63@* @H_403_63@msg @H_403_63@= @H_403_63@ @H_403_63@" @H_403_63@按q键使服务安全退出/r/n @H_403_63@" @H_403_63@;
128 @H_403_63@eh @H_403_63@-> @H_403_63@peer().send_n(msg,strlen(msg) @H_403_63@+ @H_403_63@1 @H_403_63@);
129 @H_403_63@ return @H_403_63@ @H_403_63@0 @H_403_63@;
130 @H_403_63@}
131 @H_403_63@
132 @H_403_63@ // Usedbythereactortodeterminetheunderlyinghandle
133 @H_403_63@ACE_HANDLEget_handle( void @H_403_63@) const @H_403_63@
134 @H_403_63@{
135 @H_403_63@ return @H_403_63@ this @H_403_63@-> @H_403_63@peer_acceptor.get_handle();
136 @H_403_63@}
137 @H_403_63@ int @H_403_63@handle_close(ACE_HANDLEh,ACE_Reactor_Maskm){
138 @H_403_63@peer_acceptor.close();
139 @H_403_63@delete this @H_403_63@;
140 @H_403_63@ return @H_403_63@ @H_403_63@0 @H_403_63@;
141 @H_403_63@}
142 @H_403_63@
143 private @H_403_63@:
144 @H_403_63@Acceptorpeer_acceptor;
145 @H_403_63@};
146 class @H_403_63@Quit_Handler: public @H_403_63@ACE_Event_Handler
147 @H_403_63@{
148 public @H_403_63@:
149 @H_403_63@Quit_Handler(ACE_Reactor @H_403_63@* @H_403_63@r):ACE_Event_Handler(r){}
150 @H_403_63@ virtual @H_403_63@ int @H_403_63@handle_exception(ACE_HANDLE)
151 @H_403_63@{
152 @H_403_63@ACE_DEBUG((LM_DEBUG, @H_403_63@" @H_403_63@停止服务器中/n @H_403_63@" @H_403_63@));
153 @H_403_63@reactor() @H_403_63@-> @H_403_63@end_reactor_event_loop();
154 @H_403_63@ return @H_403_63@ @H_403_63@- @H_403_63@1 @H_403_63@;
155 @H_403_63@}
156 @H_403_63@ int @H_403_63@handle_close(ACE_HANDLEh,ACE_Reactor_Maskm)
157 @H_403_63@{
158 @H_403_63@delete this @H_403_63@;
159 @H_403_63@ return @H_403_63@ @H_403_63@0 @H_403_63@;
160 @H_403_63@}
161 @H_403_63@ virtual @H_403_63@ @H_403_63@~ @H_403_63@Quit_Handler(){}
162 @H_403_63@};
163 static @H_403_63@ACE_THR_FUNC_RETURNrun_events( void @H_403_63@ @H_403_63@* @H_403_63@arg);
164 static @H_403_63@ACE_THR_FUNC_RETURNcontroller( void @H_403_63@ @H_403_63@* @H_403_63@arg);
165 int @H_403_63@ACE_TMAIN( int @H_403_63@argc, char @H_403_63@ @H_403_63@* @H_403_63@argv[])
166 @H_403_63@{
167 @H_403_63@
168 @H_403_63@ACE_Reactor @H_403_63@* @H_403_63@reactor @H_403_63@= @H_403_63@ACE_Reactor::instance();
169 @H_403_63@ if @H_403_63@(ACE_Thread_Manager::instance() @H_403_63@-> @H_403_63@spawn(run_events,reactor,THR_DETACHED @H_403_63@| @H_403_63@THR_SCOPE_SYSTEM) @H_403_63@==- @H_403_63@1 @H_403_63@)
170 @H_403_63@ return @H_403_63@ @H_403_63@1 @H_403_63@;
171 @H_403_63@ if @H_403_63@(ACE_Thread_Manager::instance() @H_403_63@-> @H_403_63@spawn(controller,THR_DETACHED @H_403_63@| @H_403_63@THR_SCOPE_SYSTEM) @H_403_63@==- @H_403_63@1 @H_403_63@)
172 @H_403_63@ return @H_403_63@ @H_403_63@1 @H_403_63@;
173 @H_403_63@ return @H_403_63@ACE_Thread_Manager::instance() @H_403_63@-> @H_403_63@wait();
174 @H_403_63@}
175 @H_403_63@
176 static @H_403_63@ACE_THR_FUNC_RETURNrun_events( void @H_403_63@ @H_403_63@* @H_403_63@arg)
177 @H_403_63@{
178 @H_403_63@ACE_Reactor @H_403_63@* @H_403_63@reactor @H_403_63@= @H_403_63@ACE_static_cast(ACE_Reactor @H_403_63@* @H_403_63@,arg);
179 @H_403_63@ACE_INET_Addraddr(PORT_NO);
180 @H_403_63@
181 @H_403_63@Echo_Accept_Handler @H_403_63@* @H_403_63@eh @H_403_63@= @H_403_63@0 @H_403_63@;
182 @H_403_63@ACE_NEW_RETURN(eh,Echo_Accept_Handler(addr), @H_403_63@1 @H_403_63@);
183 @H_403_63@
184 @H_403_63@ACE_Reactor::instance() @H_403_63@-> @H_403_63@owner(ACE_OS::thr_self());
185 @H_403_63@reactor @H_403_63@-> @H_403_63@register_handler(eh,ACE_Event_Handler::ACCEPT_MASK);
186 @H_403_63@ACE_Reactor::instance() @H_403_63@-> @H_403_63@run_reactor_event_loop();
187 @H_403_63@ return @H_403_63@ @H_403_63@0 @H_403_63@;
188 @H_403_63@}
189 static @H_403_63@ACE_THR_FUNC_RETURNcontroller( void @H_403_63@ @H_403_63@* @H_403_63@arg)
190 @H_403_63@{
191 @H_403_63@ACE_Reactor @H_403_63@* @H_403_63@reactor @H_403_63@= @H_403_63@ACE_static_cast(ACE_Reactor @H_403_63@* @H_403_63@,arg);
192 @H_403_63@Quit_Handler @H_403_63@* @H_403_63@quit_handler @H_403_63@= @H_403_63@0 @H_403_63@;
193 @H_403_63@ACE_NEW_RETURN(quit_handler,Quit_Handler(reactor), @H_403_63@1 @H_403_63@);
194 @H_403_63@ for @H_403_63@(;;)
195 @H_403_63@{
196 @H_403_63@std:: string @H_403_63@line;
197 @H_403_63@std::getline(std::cin,line, @H_403_63@' @H_403_63@/n @H_403_63@' @H_403_63@);
198 @H_403_63@ if @H_403_63@(line @H_403_63@== @H_403_63@" @H_403_63@quit @H_403_63@" @H_403_63@){
199 @H_403_63@ACE_DEBUG((LM_DEBUG, @H_403_63@" @H_403_63@请求停止服务器/n @H_403_63@" @H_403_63@));
200 @H_403_63@reactor @H_403_63@-> @H_403_63@notify(quit_handler);
201 @H_403_63@ break @H_403_63@;
202 @H_403_63@}
203 @H_403_63@}
204 @H_403_63@ return @H_403_63@ @H_403_63@0 @H_403_63@;
205 @H_403_63@}
206
原文链接:https://www.f2er.com/react/308511.html

猜你在找的React相关文章