ACE_Proactor框架代码简析
2008-07-05 16:09
204 查看
这个框架里涉及了ACE_Handler相关继承体系里的几个类,我只是随需查看。
1.ACE_Proactor(以及ACE_WIN32_Proactor——theImpl)
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#网络编程的一定很熟悉下面的代码:
只在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了。
示意代码:
1.ACE_Proactor(以及ACE_WIN32_Proactor——theImpl)
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#网络编程的一定很熟悉下面的代码:
NetworkStreamns=tc.GetStream(); StreamReadersr=newStreamReader(ns); StreamWritersw=newStreamWriter(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(); } classmyservicehandler:publicACE_Service_Handler { public: virtualvoidopen(ACE_HANDLEnew_handle,ACE_Message_Block&message_block) { this->handle(new_handle); rs.open(*this,handle()); ws.open(*this,handle()); ACE_Message_Block*mb=newACE_Message_Block(1024); rs.read(*mb,1024); } virtualvoidhandle_read_stream(constACE_Asynch_Read_Stream::Result&result) { cout<<"connectedstream"<<endl; ACE_Message_Block*mb=&result.message_block(); if(!result.success()||mb->length()<=0) //注意这里对断开连接的判断 { delete mb; cout<<"disconnectedconnection"<<endl; } else { mb->length(0); rs.read(*mb,1024); } } private: ACE_Asynch_Read_Stream rs; ACE_Asynch_Write_Stream ws; }; classmytask:publicACE_Task<ACE_NULL_SYNCH> { public: int svc() { char c; cin>>c; cleanup1(); return 0; } }; int_tmain(intargc,_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(); return0; }
相关文章推荐
- ACE_Proactor框架代码简析
- 基于ACE Proactor框架下高并发、大容量吞吐程序设计既最近的一个产品开发总结
- ACE Reactor框架使用实例-大量代码
- 5 ACE acceptor connector Proactor异步框架
- 【原创】基于ACE Proactor框架下高并发、大容量吞吐程序设计既最近的一个产品开发总结
- 高效的 ACE Proactor框架
- MTK IMS框架简析(1)——代码架构及模块初始化
- Android原生”SlidingMenu”框架的代码简析
- ACE主要应用框架与类别(三):Proactor前摄式框架的工作原理示意图
- 基于ACE Proactor框架下高并发、大容量吞吐程序设计既最近的一个产品开发总结
- Ajax底层代码简析(可直接用的框架)
- 基于ACE Proactor框架下高并发、大容量吞吐程序设计既最近的一个产品开发总结
- 基于ACE Proactor框架下高并发、大容量吞吐程序设计
- 【原创】基于ACE Proactor框架下高并发、大容量吞吐程序设计既最近的一个产品开发总结
- 基于ACE Proactor框架下高并发、大容量吞吐程序设计既最近的一个产品开发总结
- ACE Proactor前摄器模式的服务器端代码
- MTK IMS框架简析(1)——代码架构及模块初始化
- ACE_Proactor框架
- DirectX游戏开发之代码的框架简析
- 异步I/O与ACE Proactor框架