基于ACE reactor_echo_server实现

前端之家收集整理的这篇文章主要介绍了基于ACE reactor_echo_server实现前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. /*
  2. * reactor_echo_server.cpp
  3.  
  4. #include <ace/Event_Handler.h>
  5. #include <ace/SOCK_Stream.h>
  6. #include <ace/SOCK_Acceptor.h>
  7. #include <ace/Timer_Queue.h>
  8. #include <ace/Reactor.h>
  9. #include <ace/Log_Msg.h>
  10. #include <ace/Singleton.h>
  11. #include <ace/Dev_Poll_Reactor.h>
  12.  
  13. #include <string>
  14. #include <map>
  15.  
  16. typedef int (*CmdHandler)(const std::string& param,ACE_SOCK_Stream& sock);
  17.  
  18. class CmdHandlers {
  19. public:
  20. bool registerCmdHandler(const std::string& cmd,CmdHandler h) {
  21. handlers.insert(std::make_pair(cmd,h));
  22. return true;
  23. }
  24.  
  25. CmdHandler getCmdHandler(const std::string& cmd) {
  26. std::map<std::string,CmdHandler>::iterator i = handlers.find(cmd);
  27. return i != handlers.end() ? i->second : CmdHandler();
  28. }
  29.  
  30. private:
  31. std::map<std::string,CmdHandler> handlers;
  32. };
  33.  
  34. typedef ACE_Singleton<CmdHandlers,ACE_Null_Mutex> CmdHandlerInst;
  35.  
  36. static const ACE_Time_Value MAX_INTERVAL(300);
  37.  
  38. class Connection: public ACE_Event_Handler {
  39. public:
  40.  
  41. Connection() {
  42.  
  43. }
  44.  
  45. ~Connection() {
  46. ACE_DEBUG((LM_DEBUG,"~Connection()\n"));
  47. }
  48.  
  49. int open(ACE_Reactor* react) {
  50.  
  51. const char* welcome = "220 Welcome.\r\n";
  52. if (sock.send(welcome,ACE_OS::strlen(welcome)) == -1)
  53. ACE_ERROR_RETURN((LM_ERROR,"%p\n","sock.send()"),-1);
  54.  
  55. this->reactor(react);
  56.  
  57. if (reactor()->schedule_timer(this,ACE_Time_Value::zero,MAX_INTERVAL) == -1)
  58. ACE_ERROR_RETURN((LM_ERROR,"reactor().schedule_timer()"),-1);
  59.  
  60. lastMsgTime = reactor()->timer_queue()->gettimeofday();
  61.  
  62. return reactor()->register_handler(this,READ_MASK);
  63. }
  64.  
  65. ACE_SOCK_Stream& socket() {
  66. return sock;
  67. }
  68.  
  69. virtual ACE_HANDLE get_handle() const {
  70. return sock.get_handle();
  71. }
  72.  
  73. virtual int handle_input(ACE_HANDLE fd) {
  74. ssize_t len = sock.recv(buf,sizeof buf);
  75. if (len <= 0) {
  76. if (len != 0)
  77. ACE_ERROR_RETURN((LM_ERROR,"sock.recv()"),-1);
  78. }
  79.  
  80. lastMsgTime = reactor()->timer_queue()->gettimeofday();
  81.  
  82. char* pos = ACE_OS::strstr(buf,"\r\n");
  83. if (pos)
  84. *pos = '\0';
  85.  
  86. pos = ACE_OS::strchr(buf,' ');
  87. std::string cmd,param;
  88. if (pos) {
  89. cmd = std::string(buf,pos);
  90. param = std::string(pos + 1);
  91. } else
  92. cmd = buf;
  93.  
  94. CmdHandler h = CmdHandlerInst::instance()->getCmdHandler(cmd);
  95. if (h)
  96. return h(param,sock);
  97. else {
  98. const char* reply = "500 FTP: command not recognized.\r\n";
  99. if (sock.send_n(reply,ACE_OS::strlen(reply)) == -1)
  100. ACE_ERROR_RETURN((LM_ERROR,"sock.send_n()"),-1);
  101. }
  102.  
  103. // if (sock.send_n(buf,len) != len) {
  104. // ACE_ERROR((LM_ERROR,"sock.send_n()"));
  105. // return -1;
  106. // }
  107.  
  108. return 0;
  109. }
  110.  
  111. virtual int handle_timeout(const ACE_Time_Value ¤t_time,const void *act) {
  112. if (current_time - lastMsgTime > MAX_INTERVAL)
  113. reactor()->remove_handler(this,READ_MASK);
  114.  
  115. return 0;
  116. }
  117.  
  118. virtual int handle_close(ACE_HANDLE handle,ACE_Reactor_Mask close_mask) {
  119. if (handle == ACE_INVALID_HANDLE)
  120. return 0;
  121.  
  122. // ACE_Reactor_Mask m = ALL_EVENTS_MASK | DONT_CALL;
  123. reactor()->cancel_timer(this);
  124. // reactor()->remove_handler(this,m);
  125.  
  126. sock.close();
  127.  
  128. delete this;
  129.  
  130. return 0;
  131. }
  132.  
  133. private:
  134. ACE_SOCK_Stream sock;
  135. char buf[512];
  136. ACE_Time_Value lastMsgTime;
  137. };
  138.  
  139. // ----------------------------------------------------------------------------
  140.  
  141. class Acceptor: public ACE_Event_Handler {
  142. public:
  143. Acceptor() {
  144.  
  145. }
  146.  
  147. ~Acceptor() {
  148. ACE_DEBUG((LM_DEBUG,"~Acceptor()\n"));
  149. }
  150.  
  151. int open(ACE_Reactor* react,unsigned short port) {
  152. this->reactor(react);
  153.  
  154. ACE_INET_Addr addr;
  155. if (addr.set(port) == -1)
  156. ACE_ERROR_RETURN((LM_ERROR,"addr.set()"),-1);
  157.  
  158. if (acceptor.open(addr,1) == -1)
  159. ACE_ERROR_RETURN((LM_ERROR,"acceptor.open()"),-1);
  160.  
  161. return reactor()->register_handler(this,ACCEPT_MASK);
  162. }
  163.  
  164. virtual ACE_HANDLE get_handle() const {
  165. return acceptor.get_handle();
  166. }
  167.  
  168. virtual int handle_input(ACE_HANDLE fd) {
  169. Connection* con = new Connection();
  170. if (acceptor.accept(con->socket()) == -1) {
  171. ACE_ERROR((LM_ERROR,"acceptor.accept()"));
  172. delete con;
  173. } else {
  174. if (con->open(reactor()) == -1)
  175. delete con;
  176. }
  177. return 0;
  178. }
  179.  
  180. private:
  181. ACE_SOCK_Acceptor acceptor;
  182. };
  183.  
  184. int main() {
  185.  
  186. ACE_Reactor* r = new ACE_Reactor(new ACE_Dev_Poll_Reactor,true);
  187. ACE_Reactor::instance(r);
  188.  
  189. Acceptor acceptor;
  190. if (acceptor.open(ACE_Reactor::instance(),9988) == -1)
  191. return 1;
  192.  
  193. return ACE_Reactor::instance()->run_reactor_event_loop();
  194. }
  195.  
  196. // ----------------------------------------------------------------------------
  197.  
  198. int handleCmdSYST(const std::string& param,ACE_SOCK_Stream& sock) {
  199. static const char* reply = "215 UNIX Type: L8\r\n";
  200. if (sock.send(reply,ACE_OS::strlen(reply)) == -1)
  201. ACE_ERROR_RETURN((LM_ERROR,-1);
  202.  
  203. return 0;
  204. }
  205.  
  206.  
  207. bool a = CmdHandlerInst::instance()->registerCmdHandler("SYST",handleCmdSYST);

猜你在找的React相关文章