用ACE的Reactor模式实现网络通讯的例子,不罗嗦,直接上代码。

服务器代码:

[cpp] view plain copy
  1. #include <ace/Reactor.h>
  2. #include <ace/SOCK_Connector.h>
  3. #include <ace/SOCK_Acceptor.h>
  4. #include <ace/Auto_Ptr.h>
  5. class ClientService : public ACE_Event_Handler
  6. {
  7. public:
  8. ACE_SOCK_Stream &peer (void) { return this->sock_; }
  9. int open (void)
  10. {
  11. //注册读就绪回调函数
  12. return this->reactor ()->register_handler(this, ACE_Event_Handler::READ_MASK);
  13. }
  14. virtual ACE_HANDLE get_handle (void) const { return this->sock_.get_handle (); }
  15. virtual int handle_input (ACE_HANDLE fd )
  16. {
  17. int rev = peer().recv(buf,sizeof(buf));
  18. if(rev<=0)
  19. return -1;
  20. buf[rev] = '\0';
  21. printf("recv: %s",buf);
  22. strcpy(buf,"hello,Client\n");
  23. peer().send(buf,strlen(buf)); //向客户端发送信息。
  24. return 0;
  25. }
  26. // 释放相应资源
  27. virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask mask)
  28. {
  29. if (mask == ACE_Event_Handler::WRITE_MASK)
  30. return 0;
  31. mask = ACE_Event_Handler::ALL_EVENTS_MASK |
  32. ACE_Event_Handler::DONT_CALL;
  33. this->reactor ()->remove_handler (this, mask);
  34. this->sock_.close ();
  35. delete this;    //socket出错时,将自动删除该客户端,释放相应资源
  36. return 0;
  37. }
  38. protected:
  39. char buf[100];
  40. ACE_SOCK_Stream sock_;
  41. };
  42. class ClientAcceptor : public ACE_Event_Handler
  43. {
  44. public:
  45. virtual ~ClientAcceptor (){this->handle_close (ACE_INVALID_HANDLE, 0);}
  46. int open (const ACE_INET_Addr &listen_addr)
  47. {
  48. if (this->acceptor_.open (listen_addr, 1) == -1)
  49. {
  50. printf("open port fail\n");
  51. return -1;
  52. }
  53. //注册接受连接回调事件
  54. return this->reactor ()->register_handler(this, ACE_Event_Handler::ACCEPT_MASK);
  55. }
  56. virtual ACE_HANDLE get_handle (void) const
  57. { return this->acceptor_.get_handle (); }
  58. virtual int handle_input (ACE_HANDLE fd )
  59. {
  60. ClientService *client = new ClientService();
  61. auto_ptr<ClientService> p (client);
  62. if (this->acceptor_.accept (client->peer ()) == -1)
  63. {
  64. printf("accept client fail\n");
  65. return -1;
  66. }
  67. p.release ();
  68. client->reactor (this->reactor ());
  69. if (client->open () == -1)
  70. client->handle_close (ACE_INVALID_HANDLE, 0);
  71. return 0;
  72. }
  73. virtual int handle_close (ACE_HANDLE handle,
  74. ACE_Reactor_Mask close_mask)
  75. {
  76. if (this->acceptor_.get_handle () != ACE_INVALID_HANDLE)
  77. {
  78. ACE_Reactor_Mask m = ACE_Event_Handler::ACCEPT_MASK |
  79. ACE_Event_Handler::DONT_CALL;
  80. this->reactor ()->remove_handler (this, m);
  81. this->acceptor_.close ();
  82. }
  83. return 0;
  84. }
  85. protected:
  86. ACE_SOCK_Acceptor acceptor_;
  87. };
  88. int main(int argc, char *argv[])
  89. {
  90. ACE_INET_Addr addr(3000,"127.0.0.1");
  91. ClientAcceptor server;
  92. server.reactor(ACE_Reactor::instance());
  93. server.open(addr);
  94. while(true)
  95. {
  96. ACE_Reactor::instance()->handle_events();
  97. }
  98. return 0;
  99. }

客户端代码:

[cpp] view plain copy
  1. #include "ace/Reactor.h"
  2. #include "ace/SOCK_Connector.h"
  3. #include <string>
  4. #include <iostream>
  5. using namespace std;
  6. class MyClient:public ACE_Event_Handler
  7. {
  8. public:
  9. bool open()
  10. {
  11. ACE_SOCK_Connector connector;
  12. ACE_INET_Addr addr(3000,"127.0.0.1");
  13. ACE_Time_Value timeout(5,0);
  14. if(connector.connect(peer,addr,&timeout) != 0)
  15. {
  16. cout<<endl<<"connect fail.";
  17. return false;
  18. }
  19. ACE_Reactor::instance()->register_handler(this,ACE_Event_Handler::READ_MASK);
  20. cout<<endl<<"connected.";
  21. strcpy(buf, "hello,Server\n");
  22. peer.send(buf,strlen(buf));
  23. return true;
  24. }
  25. ACE_HANDLE get_handle(void) const
  26. {
  27. return peer.get_handle();
  28. }
  29. int handle_input (ACE_HANDLE fd)
  30. {
  31. int rev=0;
  32. ACE_Time_Value timeout(5,0);
  33. if((rev=peer.recv(buf,sizeof(buf),&timeout))>0)
  34. {
  35. buf[rev]='\0';
  36. cout<<endl<<"recv: "<<buf<<endl;
  37. }
  38. return 3;
  39. }
  40. private:
  41. ACE_SOCK_Stream peer;
  42. char buf[100];
  43. };
  44. int main(int argc, char *argv[])
  45. {
  46. MyClient client;
  47. client.open();
  48. while(true)
  49. {
  50. ACE_Reactor::instance()->handle_events();
  51. }
  52. return 0;
  53. }

分别编译运行(先运行服务端,后运行客户端)下面是执行结果。

服务器:

recv: hello,Server

客户端:

connected.
recv: hello,Client

参考:

http://www.cnblogs.com/TianFang/archive/2006/12/13/591332.html

http://www.cnblogs.com/TianFang/archive/2006/12/18/595938.html

用ACE的Reactor模式实现网络通讯的例子相关推荐

  1. Go 开源说第十八期预告:基于 Reactor 模式开发网络服务——gnet

    点击蓝字 关注我们 写在前面 GoCN开源说是GoCN推出的一档分享Go开源好项目的直播栏目,通过开源说希望能够帮助到开源作者们实现以下目标: 第一是去推广他们的开源项目 第二说说背后的设计原理和理念 ...

  2. ACE反应器(Reactor)模式

    1.ACE反应器框架简介 反应器(Reactor):用于事件多路分离和分派的体系结构模式 通常的,对一个文件描述符指定的文件或设备, 有两种工作方式: 阻塞与非阻塞.所谓阻塞方式的意思是指, 当试图对 ...

  3. ACE之Reactor模式使用实例

    // ACE_Reactor_Client.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h"#include "ace/Reactor ...

  4. LabWindows网络通讯程序例子(UDP)

    UDP相关知识 1.对于UDP回调函数UDPCallback的UDP_DATAREADY事件,每次datagram达到时,都会产生回调事件("This event is received o ...

  5. 发布一个基于 Reactor 模式的 C++ 网络库

    发布一个基于 Reactor 模式的 C++ 网络库 陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice 2010 Aug 30 本文主要介绍 muduo 网 ...

  6. ACE - Reactor模式源码剖析及具体实现(大量源码慎入)

    原文出自http://www.cnblogs.com/binchen-china,禁止转载. 在之前的文章中提到过Reactor模式和Preactor模式,现在利用ACE的Reactor来实现一个基于 ...

  7. Kubernetes Pod概念与网络通讯模式

    Kubernetes 要掌握的知识点 Pod概念 Pod控制类型 ReplicationController&ReplicaSet&Deplovment ★Deployment HPA ...

  8. java reactor模式例子_回顾 Reactor 模式

    Reactor 作为网络编程库的核心模式的 Reactor 模式是网络编程中的最常用的模式,反应器 Reactor 又名分派器 Dispatcher, 或通知器 Notifier, 重温一下 POSA ...

  9. Linux网络编程 | 事件处理模式:Reactor模式、Proactor模式

    文章目录 Reactor模式 Proactor模式 同步I/O模型模拟Proactor模式 两者的优缺点 Reactor Proactor 随着网络设计模式的兴起,Reactor和Proactor事件 ...

最新文章

  1. 2022-2028年中国复膜胶行业发展现状调查及市场前景趋势报告
  2. 李开复:我们该向硅谷学习什么?附独家演讲视频
  3. iOS之深入解析如何构建动态库与framework动态更新
  4. virt-manager 的桥接网络配置问题
  5. 阿里云提出“云+Fintech”新金融战略 已助上万家金融机构上云
  6. 今天的这天晚上的飞鸽传书
  7. 比特币开发者:BSC可能会超越以太坊成为顶级智能合约平台
  8. php bloginfo templatedirectory,PHP变量不显示使用bloginfo('template_directory')的图像
  9. html5游戏开发-零基础开发RPG游戏-开源讲座(四)
  10. ansible之cron模块
  11. python多线程并发每秒6000_Python多线程并发的误区
  12. dontshrink解决ProGuard错误:java.lang.StackOverflowError
  13. 安装微软活动目录的八个重要理由
  14. Monte Carlo Counterfactual Regret Minimization
  15. 2022年上半年软考成绩查询时间 和方法如下:
  16. Windows Server 2008 R2中关闭“IE增强的安全配置”
  17. 梳状谱干扰matlab仿真,干扰信号MATLAB仿真.ppt
  18. 安卓钉子户的倔强:只有18.3%的用户会考虑换用iPhone 13
  19. 《概率论与数理统计》复习笔记
  20. Matlab绘制二维(三维)图形时设置对数坐标轴

热门文章

  1. python动态生成数据库表_使用Python创建MySQL数据库实现字段动态添加以及动态的插入数据...
  2. php中url问题,PHP中URL域的解析
  3. Time(sdutoj2272)_JAVA
  4. 9.NoSQL数据库第1部分
  5. 1.我和python的第一次亲密接触
  6. 第九天2017/04/18(3、重载/覆盖 PK 重写/重定义、父类子类混搭风、抽象类)
  7. 第一天2017/03/28
  8. BeanUtils入门
  9. 史上最全的Chrome使用技巧集锦
  10. Java集合框架源码剖析:LinkedHashSet 和 LinkedHashMap