您当前的位置: 首页 >  网络

phymat.nico

暂无认证

  • 1浏览

    0关注

    1967博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

用ACE的Reactor模式实现网络通讯的例子

phymat.nico 发布时间:2017-12-20 21:54:39 ,浏览量:1

用ACE的Reactor模式实现网络通讯的例子,不罗嗦,直接上代码。

服务器代码:

[cpp] view plain copy
  1. #include   
  2. #include    
  3. #include    
  4. #include   
  5.   
  6.   
  7. class ClientService : public ACE_Event_Handler  
  8. {  
  9. public:  
  10.     ACE_SOCK_Stream &peer (void) { return this->sock_; }  
  11.   
  12.     int open (void)  
  13.     {  
  14.         //注册读就绪回调函数  
  15.         return this->reactor ()->register_handler(this, ACE_Event_Handler::READ_MASK);  
  16.     }  
  17.   
  18.     virtual ACE_HANDLE get_handle (void) const { return this->sock_.get_handle (); }  
  19.   
  20.     virtual int handle_input (ACE_HANDLE fd )  
  21.     {  
  22.         int rev = peer().recv(buf,sizeof(buf));  
  23.         if(revreactor ()->remove_handler (this, mask);  
  24.         this->sock_.close ();  
  25.         delete this;    //socket出错时,将自动删除该客户端,释放相应资源  
  26.         return 0;  
  27.     }  
  28.   
  29. protected:  
  30.     char buf[100];  
  31.     ACE_SOCK_Stream sock_;  
  32. };  
  33.   
  34.   
  35. class ClientAcceptor : public ACE_Event_Handler  
  36. {  
  37. public:  
  38.     virtual ~ClientAcceptor (){this->handle_close (ACE_INVALID_HANDLE, 0);}  
  39.   
  40.     int open (const ACE_INET_Addr &listen_addr)  
  41.     {  
  42.         if (this->acceptor_.open (listen_addr, 1) == -1)  
  43.         {  
  44.             printf("open port fail\n");  
  45.             return -1;  
  46.         }  
  47.         //注册接受连接回调事件  
  48.         return this->reactor ()->register_handler(this, ACE_Event_Handler::ACCEPT_MASK);  
  49.     }  
  50.   
  51.     virtual ACE_HANDLE get_handle (void) const  
  52.     { return this->acceptor_.get_handle (); }  
  53.   
  54.     virtual int handle_input (ACE_HANDLE fd )  
  55.     {  
  56.         ClientService *client = new ClientService();  
  57.         auto_ptr p (client);  
  58.   
  59.         if (this->acceptor_.accept (client->peer ()) == -1)  
  60.         {  
  61.             printf("accept client fail\n");  
  62.             return -1;  
  63.         }  
  64.         p.release ();  
  65.         client->reactor (this->reactor ());  
  66.         if (client->open () == -1)  
  67.             client->handle_close (ACE_INVALID_HANDLE, 0);  
  68.         return 0;  
  69.     }  
  70.       
  71.     virtual int handle_close (ACE_HANDLE handle,  
  72.         ACE_Reactor_Mask close_mask)  
  73.     {  
  74.         if (this->acceptor_.get_handle () != ACE_INVALID_HANDLE)  
  75.         {  
  76.             ACE_Reactor_Mask m = ACE_Event_Handler::ACCEPT_MASK |  
  77.                 ACE_Event_Handler::DONT_CALL;  
  78.             this->reactor ()->remove_handler (this, m);  
  79.             this->acceptor_.close ();  
  80.         }  
  81.         return 0;  
  82.     }  
  83.   
  84. protected:  
  85.     ACE_SOCK_Acceptor acceptor_;  
  86. };  
  87.   
  88. int main(int argc, char *argv[])   
  89. {  
  90.     ACE_INET_Addr addr(3000,"127.0.0.1");  
  91.     ClientAcceptor server;  
  92.     server.reactor(ACE_Reactor::instance());  
  93.     server.open(addr);  
  94.   
  95.     while(true)  
  96.     {  
  97.         ACE_Reactor::instance()->handle_events();   
  98.     }  
  99.   
  100.     return 0;   
  101. }   

客户端代码:

[cpp] view plain copy
  1. #include "ace/Reactor.h"  
  2. #include "ace/SOCK_Connector.h"  
  3.   
  4. #include   
  5. #include   
  6. using namespace std;  
  7.   
  8. class MyClient:public ACE_Event_Handler   
  9. {  
  10. public:  
  11.     bool open()  
  12.     {  
  13.         ACE_SOCK_Connector connector;  
  14.         ACE_INET_Addr addr(3000,"127.0.0.1");  
  15.         ACE_Time_Value timeout(5,0);  
  16.         if(connector.connect(peer,addr,&timeout) != 0)  
  17.         {  
  18.             cout
关注
打赏
1659628745
查看更多评论
立即登录/注册

微信扫码登录

0.0444s