ACE_Proactor框架代码简析
来源:互联网 发布:潮州好玩的地方 知乎 编辑:程序博客网 时间:2024/06/06 02:49
这个框架里涉及了ACE_Handler相关继承体系里的几个类,我只是随需查看。
1.ACE_Proactor(以及ACE_WIN32_Proactor——the Impl)
ACE_Proactor需要桥接ACE_Proactor_Impl,在win32上,这个ACE_Proactor_Impl是完成端口的封装 (服务器开发者们眼睛要绿的丷丷),也就是说,win32上的Proactor就是完成端口机制(如果你用其他Impl那另说)。
和Reactor框架类似,proactor_run_event_loop负责循环处理工作,它内部调用handle_events,进而转到 Impl->handle_events,在ACE_WIN32_Proactor::handle_events中调用了 GetQueuedCompletionStatus方法(OK,proactor_run_event_loop负责完成端口事件处理)。从GQCS方 法中知道,overlapped被ACE_WIN32_Asynch_Result(也就是ACE_Asynch_Result)继承。完成端口事件后期 处理全部交给ACE_Asynch_Result处理。
register_handle方法中调用了CreateIoCompletionPort(OK,完成端口事件在这里关联)。
完成端口句柄(ACE_WIN32_Proactor::completion_port_)在构造函数中创建。
2.ACE_Asynch_ReadStream和ACE_Asynch_Write_Stream
用过C#网络编程的一定很熟悉下面的代码:
- NetworkStream ns = tc.GetStream();
- StreamReader sr = new StreamReader(ns);
- StreamWriter sw = new StreamWriter(ns);
只在sr上关心读操作,而且使用者只需知道这是个可读流,跟网络、Socket等无关。
好的设计构架本质上是想通的,和c#中由NetworkStream到sr、sw的构造函数类似,ACE提供了open方法把流绑定到特定io上。
3.ACE_Asynch_Acceptor、ACE_Asynch_Connector ACE_Service_Handler是这两个类工厂的目标,也就是说,对于特定的事件,工厂会生产出ACE_Service_Handler应对特定 处理。
同ACE中的其他open一样,ACE_Asynch_Acceptor<HANDLER>::open提供了socket的绑定、监 听,当有连接到达的时候,open生成ACE_Service_Handler并调用新对象的open方法让对象可以对新的连接进行一些处理工作(譬如打 开sr和sw等)。 ACE_Service_Handler继承于ACE_Handler,它声明了open方法,并且从基类中继承了handle_xxx系列方法,从 这里开看,Proactor框架中处理数据靠的是这个类(我们需要做的是继承这个类以获得对实际问题的处理能力),而新建连接的问题,则有框架帮我们做好 了,不需要定制处理、验证的话,没有必要修改其他类。
4.最后
到这里,在win32上使用完成端口的工作变得异常简单,实现一个ACE_Service_Handler就ok了。
示意代码:
- void cleanup1()
- {
- ACE_Proactor::instance()->proactor_end_event_loop();
- }
- class myservicehandler :public ACE_Service_Handler
- {
- public:
- virtual void open (ACE_HANDLE new_handle
- ,ACE_Message_Block &message_block)
- {
- this->handle(new_handle);
- rs.open(*this,handle());
- ws.open(*this,handle());
- ACE_Message_Block* mb = new ACE_Message_Block(1024);
- rs.read(*mb,1024);
- }
- virtual void handle_read_stream
- (const ACE_Asynch_Read_Stream::Result &result)
- {
- cout<<"connected stream"<<endl;
- ACE_Message_Block* mb = &result.message_block();
- if (!result.success() || mb->length() <= 0)//注意这里对断开连接的判断
- {
- delete mb;
- cout<<"disconnected connection"<<endl;
- }
- else
- {
- mb->length(0);
- rs.read(*mb,1024);
- }
- }
- private:
- ACE_Asynch_Read_Stream rs;
- ACE_Asynch_Write_Stream ws;
- };
- class mytask :public ACE_Task<ACE_NULL_SYNCH>
- {
- public:
- int svc()
- {
- char c;
- cin>>c;
- cleanup1();
- return 0;
- }
- };
- int _tmain(int argc, _TCHAR* argv[])
- {
- ACE::init();
- ACE_INET_Addr addr(2350);
- ACE_Asynch_Acceptor<myservicehandler> acceptor;
- acceptor.open(addr);
- mytask tk;
- tk.activate();
- ACE_Proactor::instance()->proactor_run_event_loop();
- ACE::fini();
- return 0;
- }
- ACE_Proactor框架代码简析
- ACE_Proactor框架代码简析
- ACE_Proactor框架
- ACE_Proactor示例
- ACE_Proactor实现
- [ACE系列] ACE_Proactor简介
- ACE_Proactor UDP V2.0
- ACE_Proactor网络通信示例
- ACE_Proactor UDP V2.0
- Android原生”SlidingMenu”框架的代码简析
- DirectX游戏开发之代码的框架简析
- [ACE_Proactor网络通信示例-Part.1]
- [ACE_Proactor网络通信示例-Part.3]
- [ACE_Proactor网络通信示例-Part.2]
- 解决ACE_Proactor中psudo_task不能正常结束的问题
- ACE_Proactor TCP(接收什么就打印什么)V1.3
- MTK IMS框架简析(1)——代码架构及模块初始化
- MTK IMS框架简析(1)——代码架构及模块初始化
- HDU2227非递减子序列(树状数组)
- Python 原始字符串(raw strings)的用法
- Super Jumping! Jumping! Jumping!
- 15个HTML5播放器插件
- Objective-C多态
- ACE_Proactor框架代码简析
- HDU2086:A1 = ?
- Android Studio IDEA:基于IDEA的安卓开发环境
- 求出32位整数左边第一位是1的算法
- lua实现美国电话号码生成函数
- stgOpenStorage读取word文档
- JAVA学习笔记(网络编程 之 socket)
- hdu 2896 病毒侵袭 (AC自动机)
- 【转】全记录:马化腾在GMIC上对话的13个要点