用ACE的Reactor模式实现网络通讯的例子
用ACE的Reactor模式实现网络通讯的例子,不罗嗦,直接上代码。
服务器代码:
- #include <ace/Reactor.h>
- #include <ace/SOCK_Connector.h>
- #include <ace/SOCK_Acceptor.h>
- #include <ace/Auto_Ptr.h>
- class ClientService : public ACE_Event_Handler
- {
- public:
- ACE_SOCK_Stream &peer (void) { return this->sock_; }
- int open (void)
- {
- //注册读就绪回调函数
- return this->reactor ()->register_handler(this, ACE_Event_Handler::READ_MASK);
- }
- virtual ACE_HANDLE get_handle (void) const { return this->sock_.get_handle (); }
- virtual int handle_input (ACE_HANDLE fd )
- {
- int rev = peer().recv(buf,sizeof(buf));
- if(rev<=0)
- return -1;
- buf[rev] = '\0';
- printf("recv: %s",buf);
- strcpy(buf,"hello,Client\n");
- peer().send(buf,strlen(buf)); //向客户端发送信息。
- return 0;
- }
- // 释放相应资源
- virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask mask)
- {
- if (mask == ACE_Event_Handler::WRITE_MASK)
- return 0;
- mask = ACE_Event_Handler::ALL_EVENTS_MASK |
- ACE_Event_Handler::DONT_CALL;
- this->reactor ()->remove_handler (this, mask);
- this->sock_.close ();
- delete this; //socket出错时,将自动删除该客户端,释放相应资源
- return 0;
- }
- protected:
- char buf[100];
- ACE_SOCK_Stream sock_;
- };
- class ClientAcceptor : public ACE_Event_Handler
- {
- public:
- virtual ~ClientAcceptor (){this->handle_close (ACE_INVALID_HANDLE, 0);}
- int open (const ACE_INET_Addr &listen_addr)
- {
- if (this->acceptor_.open (listen_addr, 1) == -1)
- {
- printf("open port fail\n");
- return -1;
- }
- //注册接受连接回调事件
- return this->reactor ()->register_handler(this, ACE_Event_Handler::ACCEPT_MASK);
- }
- virtual ACE_HANDLE get_handle (void) const
- { return this->acceptor_.get_handle (); }
- virtual int handle_input (ACE_HANDLE fd )
- {
- ClientService *client = new ClientService();
- auto_ptr<ClientService> p (client);
- if (this->acceptor_.accept (client->peer ()) == -1)
- {
- printf("accept client fail\n");
- return -1;
- }
- p.release ();
- client->reactor (this->reactor ());
- if (client->open () == -1)
- client->handle_close (ACE_INVALID_HANDLE, 0);
- return 0;
- }
- virtual int handle_close (ACE_HANDLE handle,
- ACE_Reactor_Mask close_mask)
- {
- if (this->acceptor_.get_handle () != ACE_INVALID_HANDLE)
- {
- ACE_Reactor_Mask m = ACE_Event_Handler::ACCEPT_MASK |
- ACE_Event_Handler::DONT_CALL;
- this->reactor ()->remove_handler (this, m);
- this->acceptor_.close ();
- }
- return 0;
- }
- protected:
- ACE_SOCK_Acceptor acceptor_;
- };
- int main(int argc, char *argv[])
- {
- ACE_INET_Addr addr(3000,"127.0.0.1");
- ClientAcceptor server;
- server.reactor(ACE_Reactor::instance());
- server.open(addr);
- while(true)
- {
- ACE_Reactor::instance()->handle_events();
- }
- return 0;
- }
客户端代码:
- #include "ace/Reactor.h"
- #include "ace/SOCK_Connector.h"
- #include <string>
- #include <iostream>
- using namespace std;
- class MyClient:public ACE_Event_Handler
- {
- public:
- bool open()
- {
- ACE_SOCK_Connector connector;
- ACE_INET_Addr addr(3000,"127.0.0.1");
- ACE_Time_Value timeout(5,0);
- if(connector.connect(peer,addr,&timeout) != 0)
- {
- cout<<endl<<"connect fail.";
- return false;
- }
- ACE_Reactor::instance()->register_handler(this,ACE_Event_Handler::READ_MASK);
- cout<<endl<<"connected.";
- strcpy(buf, "hello,Server\n");
- peer.send(buf,strlen(buf));
- return true;
- }
- ACE_HANDLE get_handle(void) const
- {
- return peer.get_handle();
- }
- int handle_input (ACE_HANDLE fd)
- {
- int rev=0;
- ACE_Time_Value timeout(5,0);
- if((rev=peer.recv(buf,sizeof(buf),&timeout))>0)
- {
- buf[rev]='\0';
- cout<<endl<<"recv: "<<buf<<endl;
- }
- return 3;
- }
- private:
- ACE_SOCK_Stream peer;
- char buf[100];
- };
- int main(int argc, char *argv[])
- {
- MyClient client;
- client.open();
- while(true)
- {
- ACE_Reactor::instance()->handle_events();
- }
- return 0;
- }
分别编译运行(先运行服务端,后运行客户端)下面是执行结果。
服务器:
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模式实现网络通讯的例子相关推荐
- Go 开源说第十八期预告:基于 Reactor 模式开发网络服务——gnet
点击蓝字 关注我们 写在前面 GoCN开源说是GoCN推出的一档分享Go开源好项目的直播栏目,通过开源说希望能够帮助到开源作者们实现以下目标: 第一是去推广他们的开源项目 第二说说背后的设计原理和理念 ...
- ACE反应器(Reactor)模式
1.ACE反应器框架简介 反应器(Reactor):用于事件多路分离和分派的体系结构模式 通常的,对一个文件描述符指定的文件或设备, 有两种工作方式: 阻塞与非阻塞.所谓阻塞方式的意思是指, 当试图对 ...
- ACE之Reactor模式使用实例
// ACE_Reactor_Client.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h"#include "ace/Reactor ...
- LabWindows网络通讯程序例子(UDP)
UDP相关知识 1.对于UDP回调函数UDPCallback的UDP_DATAREADY事件,每次datagram达到时,都会产生回调事件("This event is received o ...
- 发布一个基于 Reactor 模式的 C++ 网络库
发布一个基于 Reactor 模式的 C++ 网络库 陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice 2010 Aug 30 本文主要介绍 muduo 网 ...
- ACE - Reactor模式源码剖析及具体实现(大量源码慎入)
原文出自http://www.cnblogs.com/binchen-china,禁止转载. 在之前的文章中提到过Reactor模式和Preactor模式,现在利用ACE的Reactor来实现一个基于 ...
- Kubernetes Pod概念与网络通讯模式
Kubernetes 要掌握的知识点 Pod概念 Pod控制类型 ReplicationController&ReplicaSet&Deplovment ★Deployment HPA ...
- java reactor模式例子_回顾 Reactor 模式
Reactor 作为网络编程库的核心模式的 Reactor 模式是网络编程中的最常用的模式,反应器 Reactor 又名分派器 Dispatcher, 或通知器 Notifier, 重温一下 POSA ...
- Linux网络编程 | 事件处理模式:Reactor模式、Proactor模式
文章目录 Reactor模式 Proactor模式 同步I/O模型模拟Proactor模式 两者的优缺点 Reactor Proactor 随着网络设计模式的兴起,Reactor和Proactor事件 ...
最新文章
- 2022-2028年中国复膜胶行业发展现状调查及市场前景趋势报告
- 李开复:我们该向硅谷学习什么?附独家演讲视频
- iOS之深入解析如何构建动态库与framework动态更新
- virt-manager 的桥接网络配置问题
- 阿里云提出“云+Fintech”新金融战略 已助上万家金融机构上云
- 今天的这天晚上的飞鸽传书
- 比特币开发者:BSC可能会超越以太坊成为顶级智能合约平台
- php bloginfo templatedirectory,PHP变量不显示使用bloginfo('template_directory')的图像
- html5游戏开发-零基础开发RPG游戏-开源讲座(四)
- ansible之cron模块
- python多线程并发每秒6000_Python多线程并发的误区
- dontshrink解决ProGuard错误:java.lang.StackOverflowError
- 安装微软活动目录的八个重要理由
- Monte Carlo Counterfactual Regret Minimization
- 2022年上半年软考成绩查询时间 和方法如下:
- Windows Server 2008 R2中关闭“IE增强的安全配置”
- 梳状谱干扰matlab仿真,干扰信号MATLAB仿真.ppt
- 安卓钉子户的倔强:只有18.3%的用户会考虑换用iPhone 13
- 《概率论与数理统计》复习笔记
- Matlab绘制二维(三维)图形时设置对数坐标轴
热门文章
- python动态生成数据库表_使用Python创建MySQL数据库实现字段动态添加以及动态的插入数据...
- php中url问题,PHP中URL域的解析
- Time(sdutoj2272)_JAVA
- 9.NoSQL数据库第1部分
- 1.我和python的第一次亲密接触
- 第九天2017/04/18(3、重载/覆盖 PK 重写/重定义、父类子类混搭风、抽象类)
- 第一天2017/03/28
- BeanUtils入门
- 史上最全的Chrome使用技巧集锦
- Java集合框架源码剖析:LinkedHashSet 和 LinkedHashMap