- 浏览: 1998583 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (651)
- ACE (35)
- BAT (9)
- C/C++ (116)
- fast-cgi (14)
- COM (27)
- python (59)
- CGI (4)
- C# (2)
- VC (84)
- DataBase (29)
- Linux (96)
- P2P (6)
- PHP (15)
- Web (6)
- Memcached (7)
- IME输入法 (11)
- 设计模式 (2)
- 搜索引擎 (1)
- 个人情感 (4)
- 笔试/面试 (3)
- 一亩三分地 (33)
- 历史 (2)
- 地理 (1)
- 人物 (3)
- 经济 (0)
- 不仅仅是笑哦 (43)
- 小故事大道理 (2)
- http://www.bjdsmyysjk120.com/ (0)
- http://www.bjdsmyy120.com/ (0)
- 它山之石可以攻玉 (15)
- 大学生你关注些什么 (28)
- 数据恢复 (1)
最新评论
-
luokaichuang:
这个规范里还是没有让我明白当浏览器上传文件时,STDIN的消息 ...
FastCGI规范 -
effort_fan:
好文章!学习了,谢谢分享!
com技术简介 -
vcell:
有错误os.walk(strPath)返回的已经是全部的文件和 ...
通过python获取目录的大小 -
feifeigd:
feifeigd 写道注意:文章中的CPP示例第二行 #inc ...
ATL入门:利用ATL编写简单的COM组件 -
feifeigd:
注意:文章中的CPP示例第二行 #include " ...
ATL入门:利用ATL编写简单的COM组件
在Socket编程中,常见的事件就是"读就绪","写就绪",通过对这两个事件的捕获分发,可以实现Socket中的异步操作。 Socket编程中的事件处理器 在前面我们已经介绍过,在ACE反应器框架中,任何都必须派生自ACE_Event_Handler类,并通过重载其相应会调事件处理函数来实现相应的回调处理的。在Socket编程中,我们通常需要重载的函数有 此外,为了使Reactor能通过I/O句柄找到对应的事件处理器,还必须重载其get_handle()方法以使得Reactor建立起I/O句柄和事件处理器的关联。 使用Reactor框架。 下面我们将以一个客户端的程序为例,介绍如何在Socket编程中使用Reactor框架。 一.建立一个客户端对象(事件处理器)。 客户端对象就是一个事件处理器,其声明如下:
在Client端中我只关心"读就绪"事件,故只重载了handle_input函数(大多数应用下只需要重载handle_input函数)。另外,在客户端还保存了一个ACE_SOCK_Stream的peer对象用来进行Socket通信,同时封装了一个Peer()函数返回它的引用。 二.重载相应回调处理函数
几个函数的功能都非常简单,这里就不多做介绍了。 三.在Reactor中注册事件 首先让我们来看看相应的main函数的代码:
在这里可以看到,使用Reactor框架后,依然首先通过ACE_SOCK_Connector的connect函数来建立连接。建立连接后,可以通过ACE_Reactor::instance()->register_handler函数来实现Reactor的注册,实现I/O事件和Client对象的handle_input方法相关联,它的第一个参数是事件处理器的地址,第二个参数是事件类型,由于这里只关心读就绪事件,故注册的事件类型是ACE_Event_Handler::READ_MASK。 四.启动Reactor事件循环 通过如上设置后,我们就可以通过ACE_Reactor::instance()->handle_events()启动Reactor循环了,这样,每当服务器端有数据发送给客户端时,当客户端的数据就绪时,就回触发Client对象的handle_input函数,将接收的数据打印出来。 通常的做法是,将Reactor事件循环作为一个单独的线程来处理,这样就不会阻塞main函数。 五.注销Reactor事件 Reactor事件的注销一般有两种方式,显式和隐式,下面将分别给予介绍。 在这个示例程序里,连接方只有一个Socket连接,Reactor的优势并没有体现出来,但在一些网络管理系统里,连接方需要对多个需要管理的设备(服务器端)进行连接,在这种情况下使用Reactor模式,只需要多开一个Reactor事件循环线程就能实现事件多路分发复用,并且不会阻塞,通过面向对象的回调方式管理,使用起来非常方便。 Reactor框架的另外一个常用的地方就是服务器端,一般是一个服务器端对应多个客户端,这样用Reactor模式能大幅提高并发能力,这方面的编程方法将在下一章给与介绍。
当I/O句柄(比如UNIX中的文件描述符)上的输入可用时,反应器自动回调该方法。
当I/O设备的输出队列有可用空间时,反应器自动回调该方法。
当事件处理器中的事件从Reactor中移除的时候调用。class Client:public ACE_Event_Handler
{
public:
ACE_HANDLE get_handle(void) const;
int handle_input (ACE_HANDLE fd);
int handle_close (ACE_HANDLE handle,
ACE_Reactor_Mask close_mask);
ACE_SOCK_Stream& Peer();
private:
ACE_SOCK_Stream peer;
};
ACE_SOCK_Stream& Client::Peer()
{
return peer;
}
ACE_HANDLE Client::get_handle(void) const
{
return peer.get_handle();
}
int Client::handle_input (ACE_HANDLE fd)
{
int rev=0;
if((rev = peer.recv(buffer,1000))>0)
{
buffer[rev]='\0';
cout<<endl<<"rev:\t"<<buffer<<endl;
return 0;
}
else //Socket连接发生错误,返回-1,在Reactor中注销事件,触发handle_close函数
{
return -1;
}
}
int Client::handle_close (ACE_HANDLE handle,
ACE_Reactor_Mask close_mask)
{
cout<<endl<<"connecetd closed";
return ACE_Event_Handler::handle_close(handle,close_mask);
}
int main(int argc, char *argv[])
{
Client client;
ACE_SOCK_Connector connector;
ACE_INET_Addr addr(3000,"127.0.0.1");
ACE_Time_Value timeout(5,0);
if(connector.connect(client.Peer(),addr,&timeout) != 0)
{
cout<<endl<<"connecetd fail";
return 0;
}
ACE_Reactor::instance()->register_handler(&client,ACE_Event_Handler::READ_MASK);
while(true)
{
ACE_Reactor::instance()->handle_events();
}
return 0;
}
当Reactor捕获事件后,会触发相应的"handle_"处理函数,当"handle_"处理函数返回值大于或等于0时,表示处理事件成功,当返回值小于0时,表示处理事件失败,这时Reactor会自动注销该句柄所注册的所有事件,并触发handle_close函数,以执行相应的资源清理工作。
在本例中,当handle_input函数里的recv函数接收到0个数时,说明socket发生错误(大多为Socket连接中断),此时返回-1,则系统自动注销相应事件。
调用Reactor对象的remove_handler方法移除,它有两个参数,第一个是所注册的事件反应器对象,第二个是所要注销的事件。
发表评论
-
u盘乱码恢复方法
2015-05-20 15:29 1690u盘乱码恢复方法,在使用u盘、SD卡、tf卡等移动储 ... -
使用 ACE 库框架在 UNIX 中开发高性能并发应用
2009-11-19 14:36 3099使用 ACE 库框架在 UNIX ... -
ACE中TCP通信
2009-09-17 11:10 2210概述: 传输控制协议TCP(Transmission C ... -
ACE的TSS bug
2009-08-26 13:55 1536ACE的TSS bug Bugzilla Bug ... -
ACE读取ini格式的配置文档
2009-08-12 15:16 2092ACE读取ini格式的配置文档 不多说了,功能很清 ... -
reactor_logging_server会出现运行 error LNK2019
2009-08-06 17:06 2535reactor_logging_server会出 ... -
ACE前摄器Proactor模式
2009-08-05 11:36 4435ACE前摄器Proactor模式 ... -
ACE_Message_Block功能简介
2009-08-05 11:35 3013ACE_Message_Block功能简介 ACE_Me ... -
ACE接受器-连接器模式
2009-08-05 11:34 3969ACE接受器-连接器模 ... -
ACE反应器(Reactor)模式(4)
2009-08-05 11:31 5153ACE反应器(Reactor)模式(4) 定时器的实现 ... -
ACE反应器(Reactor)模式(3)
2009-08-05 11:31 3852ACE反应器(Reactor)模式(3 ... -
ACE反应器(Reactor)模式(1)
2009-08-05 11:29 3322ACE反应器(Reactor)模式(1 ... -
ACE主动对象模式(2)
2009-08-05 11:28 2099ACE主动对象模式(2) 在上篇文章里,我们简单的介绍了 ... -
ACE主动对象模式(1)
2009-08-05 11:27 2192ACE主动对象模式(1) 主动对象模式用于降低方法执行和 ... -
ACE中UDP通信
2009-08-05 11:26 2878ACE中UDP通信 udp是一种无连接的协议,提供无连接 ... -
ACE中TCP通信
2009-08-05 11:25 3134ACE中TCP通信 概述: 传输控制协议TCP(Tra ... -
ACE线程管理机制-面向对象的线程类ACE_Task
2009-08-05 11:24 2683ACE线程管理机制-面向 ... -
ACE线程管理机制-线程的创建与管理
2009-08-05 11:23 2429ACE线程管理机制-线程的创建与管理 有过在不同的操作系 ... -
ACE自适配通信环境简介
2009-08-05 11:21 1873ACE自适配通信环境简 ... -
获取主机信息(C++和C#版)
2009-08-05 11:15 2168获取主机信息(C++和C#版) 在C语言中,主机信息是存 ...
相关推荐
ACE proactor 与 Reactor 模式的详解
本篇文章是对ACE反应器(Reactor)模式进行了详细的分析介绍,需要的朋友参考下
ace reactor,单线程的多路分离工作模式。客户端,只需要简单的信号发送即可,代码略,见谅
一个ACE写的服务器端,可以连接多个用户,并处理其请求
但是你也可以选择自己的反应器,这是因为ACE使用了Bridge模式(使用两个不同的类:一个是编程接口,另一个是实现,第一个类会把各个操作传给第二个类)。例如使用线程池反应器实现:ACE_TP_Reactor* tp_reactor = ...
用VS2005编写的ObjectArx永久反应器例子,将反应器加入到模型空间,程序中有五条直线,拖动一根直线,其他直线也相应的变化。保存DWG图后,再次打开后可继续使用反应器。
里面的内容出自一个人的博客,是相关ACE方面对Reactor的运用,本人刚学习,所有上传保存之。
Recycle reactor(循环反应器)
本人学习ACE 时候写的关于两种通信方式的实例代码,我把三个连写都写在了一个文件,根据需要注释掉其他的就行。 ACE用于开发通信程序非常方便,尤其相对于WinSock 来说,可以省很多代码,普通程序员也更容易理解
Reactor模式和NIO Java的NIO为reactor模式提供了实现的基础机制,它的Selector当发现某个channel有数据时,会通过SlectorKey来告知我们,在此我们实现事件和handler的绑定
c++高并发模式的reactor模式,其主要作用就是在接收信息之后在线程池中进行选择空闲线程进行处理
ACE 入门,ACE中文文档,ACE_Task框架,ACE的框架及其核心,ACE反应器(Reactor)模式,ACE线程管理机制,ACE通用服务端框架,ACE通用客户端框架,ACE中TCP通信
reactor-netty, TCP/HTTP/UDP 客户机/服务器,带有联网的反应器 反应器联网 http://projectreactor.io/docs/netty/release/api/在软件许可证 2.0许可,,,。
学习ACE Reactor的好资料, 介绍了开源分布式开源代码ACE中Reactor的使用方法。
Easy-Reactor是一个基于Reactor模式的Linux C++网络服务器框架,支持多线程TCP服务器,单线程TCP服务器,单线程UDP服务器等形式,可以让使用者完全专注于业务,快速开发出一个高效的服务器应用。 在工作中开发基础...
主要介绍了Java Reactor反应器模式使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
reactor模式详细描述。由ACE作者亲自写作!
第 7 章 ACE 反应器(Reactor)的设计和使用:用于事件多路分离的面向对象框架 第 8 章 前摄器(Proactor):用于为异步事件多路分离和分派处理器的对象行为模式 第 9 章 接受器-连接器(Acceptor-Connector):...
基于epoll简单的实现一个基本的reactor模式,本例程仅供参考和学习