ACE官网,下载ace及ace文档:
The ADAPTIVE Communication Environment (ACE) http://www.cs.wustl.edu/~schmidt/ACE.html
ACE Class Categories
http://www.dre.vanderbilt.edu/~schmidt/DOC_ROOT/ACE/docs/ACE-categories.html
ACE-tutorial:
www.cs.wustl.edu/~schmidt/PDF/ACE-tutorial.pdf http://www.cs.wustl.edu/~schmidt/PDF/ACE-tutorial.pdf
An Architectural Overview of the ACE Framework:
login.dvi http://www.cs.wustl.edu/~schmidt/PDF/login.pdf
参考:
ACE的框架及其核心 - 蚂蚁跳楼 - 博客园 https://www.cnblogs.com/xianqingzh/archive/2011/11/29/2267400.html
ace 反应式服务器例子 - CSDN博客 http://blog.csdn.net/dai_jing/article/details/22388389
关于ACE_Svc_Handler 一个例子 - CSDN博客 http://blog.csdn.net/fcryuuhou/article/details/8814102
[0]ACE环境搭建_雪泥泓爪_新浪博客 http://blog.sina.com.cn/s/blog_cf4ddb250102wn3t.html
两种高性能I/O设计模式(Reactor/Proactor)的比较 http://www.360doc.com/content/14/0122/20/3735408_347185935.shtml
ACE网络开发中,各种Reactor实现的总结 http://www.360doc.com/content/13/0825/23/8373418_309888394.shtml
ACE_Svc_Handler 通信原理 - 陈波的日志 - 网易博客 http://blog.163.com/cp7618%40yeah/blog/static/702347772011116112316677/
开源C/C++网络库比较 http://www.360doc.com/content/13/0509/11/9200790_284094456.shtml
有效使用反应堆Reactor的设计准则 - CSDN博客 http://blog.csdn.net/gunwithrose/article/details/1683374
ACE 的Reactor/Proactor框架下高并发、大容量吞吐介绍 - CSDN博客 http://blog.csdn.net/zzhongcy/article/details/41380067
ACE笔记(3)-用 ACE_Reactor 实现SOCKET事件处理 - CSDN博客 http://blog.csdn.net/AnyJack/article/details/344631
用ACE的Reactor模式实现网络通讯的例子 - CSDN博客 http://blog.csdn.net/iw1210/article/details/36204429
采用C++的ACE库实现的一个通用的C/S架构通信程序(最终版) - 晴天的专栏 - CSDN博客 http://blog.csdn.net/rain_qingtian/article/details/22862919
ACE编程小结 - CSDN博客 http://blog.csdn.net/mjp_mjp/article/details/4406059
ACE的SOCKET通信例子:handle_input 函数的返回值不能随便写! - CSDN博客 http://blog.csdn.net/iw1210/article/details/45168145
ACE前摄器Proactor模式 - 天方 - 博客园 http://www.cnblogs.com/TianFang/archive/2006/12/31/608952.html
ACE_Service_Handler类的理解和使用 - chinaclock的专栏 - CSDN博客 http://blog.csdn.net/chinaclock/article/details/49278653
udp:
采用C++的ACE库实现的一个通用的udp通信服务器程序 - CSDN博客 http://blog.csdn.net/itclock/article/details/1036647
非常好的例子:
udp_reactor.rar udp_reactor.cpp http://read.pudn.com/downloads206/sourcecode/unix_linux/972540/udp_reactor.cpp__.htm
PSS/ProactorUDPClient.cpp at master · freeeyes/PSS · GitHub https://github.com/freeeyes/PSS/blob/master/purenessscopeserver/purenessscopeserver/PurenessScopeServer/UDP/ProactorUDPClient.cpp
ACE_Proactor UDP V2.0 - Linux,音视频,大数据,人工智能,网络编程,分布式系统 - CSDN博客 https://blog.csdn.net/shixin_0125/article/details/78858890
完整一点的Reactor框架的udpserver - CSDN博客 http://blog.csdn.net/haohao_h/article/details/1377134
ACE+线程池实现一个简单的服务器+多客户端通信程序 - CSDN博客 http://blog.csdn.net/j_akill/article/details/39621453
基于ACE的线程池学习与实现(三)—— 并发编程资料 - CSDN博客 http://blog.csdn.net/luson_xing/article/details/8517782
利用ace的ACE_Task等类实现线程池 - CSDN博客 http://blog.csdn.net/wallwind/article/details/7304155
两种IO多路复用方案:Reactor and Proactor
一般情况下,I/O 复用机制需要事件分享器(event demultiplexor [1, 3]). 事件分享器的作用,即将那些读写事件源分发给各读写事件的处理者,就像送快递的在楼下喊: 谁的什么东西送了, 快来拿吧。开发人员在开始的时候需要在分享器那里注册感兴趣的事件,并提供相应的处理者(event handlers),或者是回调函数; 事件分享器在适当的时候会将请求的事件分发给这些handler或者回调函数.
涉及到事件分享器的两种模式称为:Reactor and Proactor [1]. Reactor模式是基于同步I/O的,而Proactor模式是和异步I/O相关的. 在Reactor模式中,事件分离者等待某个事件或者可应用或个操作的状态发生(比如文件描述符可读写,或者是socket可读写),事件分离者就把这个事件传给事先注册的事件处理函数或者回调函数,由后者来做实际的读写操作。
而在Proactor模式中,事件处理者(或者代由事件分离者发起)直接发起一个异步读写操作(相当于请求),而实际的工作是由操作系统来完成的。发起时,需要提供的参数包括用于存放读到数据的缓存区,读的数据大小,或者用于存放外发数据的缓存区,以及这个请求完后的回调函数等信息。事件分离者得知了这个请求,它默默等待这个请求的完成,然后转发完成事件给相应的事件处理者或者回调。举例来说,在Windows上事件处理者投递了一个异步IO操作(称有overlapped的技术),事件分离者等IOCompletion事件完成[1]. 这种异步模式的典型实现是基于操作系统底层异步API的,所以我们可称之为“系统级别”的或者“真正意义上”的异步,因为具体的读写是由操作系统代劳的。
举另外个例子来更好地理解Reactor与Proactor两种模式的区别。这里我们只关注read操作,因为write操作也是差不多的。下面是Reactor的做法:
- 某个事件处理者宣称它对某个socket上的读事件很感兴趣;
- 事件分离者等着这个事件的发生;
- 当事件发生了,事件分离器被唤醒,这负责通知先前那个事件处理者;
- 事件处理者收到消息,于是去那个socket上读数据了. 如果需要,它再次宣称对这个socket上的读事件感兴趣,一直重复上面的步骤;
下面再来看看真正意义的异步模式Proactor是如何做的:
- 事件处理者直接投递发一个写操作(当然,操作系统必须支持这个异步操作). 这个时候,事件处理者根本不关心读事件,它只管发这么个请求,它魂牵梦萦的是这个写操作的完成事件。这个处理者很拽,发个命令就不管具体的事情了,只等着别人(系统)帮他搞定的时候给他回个话。
- 事件分离者等着这个读事件的完成(比较下与Reactor的不同);
- 当事件分离者默默等待完成事情到来的同时,操作系统已经在一边开始干活了,它从目标读取数据,放入用户提供的缓存区中,最后通知事件分离者,这个事情我搞完了;
- 事件分享者通知之前的事件处理者: 你吩咐的事情搞定了;
- 事件处理者这时会发现想要读的数据已经乖乖地放在他提供的缓存区中,想怎么处理都行了。如果有需要,事件处理者还像之前一样发起另外一个写操作,和上面的几个步骤一样。