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#网络编程的一定很熟悉下面的代码:

  1. NetworkStream ns = tc.GetStream(); 
  2. StreamReader sr = new StreamReader(ns); 
  3. 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了。

示意代码:

  1. void    cleanup1() 
  2. ACE_Proactor::instance()->proactor_end_event_loop(); 
  3. class myservicehandler :public ACE_Service_Handler 
  4. public
  5.     virtual void open (ACE_HANDLE new_handle
  6. ,ACE_Message_Block &message_block) 
  7.     { 
  8.         this->handle(new_handle); 
  9.         rs.open(*this,handle()); 
  10.         ws.open(*this,handle()); 
  11.         ACE_Message_Block* mb = new ACE_Message_Block(1024); 
  12.         rs.read(*mb,1024); 
  13.     } 
  14.  
  15.     virtual void handle_read_stream
  16.  (const ACE_Asynch_Read_Stream::Result &result) 
  17.     { 
  18.         cout<<"connected stream"<<endl; 
  19.         ACE_Message_Block* mb = &result.message_block(); 
  20.         if (!result.success() || mb->length() <= 0)//注意这里对断开连接的判断 
  21.         { 
  22.             delete  mb; 
  23.             cout<<"disconnected connection"<<endl; 
  24.         } 
  25.         else 
  26.         { 
  27.             mb->length(0); 
  28.             rs.read(*mb,1024); 
  29.         } 
  30.     } 
  31. private
  32.     ACE_Asynch_Read_Stream  rs; 
  33.     ACE_Asynch_Write_Stream ws; 
  34. }; 
  35.  
  36. class mytask :public ACE_Task<ACE_NULL_SYNCH> 
  37. public
  38.     int svc() 
  39.     { 
  40.         char    c; 
  41.         cin>>c; 
  42.         cleanup1(); 
  43.         return  0; 
  44.     } 
  45. }; 
  46.  
  47. int _tmain(int argc, _TCHAR* argv[]) 
  48.     ACE::init(); 
  49.     ACE_INET_Addr   addr(2350); 
  50.     ACE_Asynch_Acceptor<myservicehandler>   acceptor; 
  51.  
  52.     acceptor.open(addr); 
  53.     mytask  tk; 
  54.     tk.activate(); 
  55.     ACE_Proactor::instance()->proactor_run_event_loop(); 
  56.  
  57.     ACE::fini(); 
  58.     return 0; 


本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201107/14746.html]
原创粉丝点击