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

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

服务器代码:

  1. #include <ace/Reactor.h>  
  2. #include <ace/SOCK_Connector.h>   
  3. #include <ace/SOCK_Acceptor.h>   
  4. #include <ace/Auto_Ptr.h>  
  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 (voidconst { 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(rev<=0)  
  24.             return -1;  
  25.         buf[rev] = '\0';  
  26.         printf("recv: %s",buf);  
  27.         strcpy(buf,"hello,Client\n");  
  28.         peer().send(buf,strlen(buf)); //向客户端发送信息。  
  29.         return 0;  
  30.     }  
  31.   
  32.     // 释放相应资源  
  33. virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask mask)  
  34.     {  
  35.         if (mask == ACE_Event_Handler::WRITE_MASK)  
  36.             return 0;  
  37.         mask = ACE_Event_Handler::ALL_EVENTS_MASK |  
  38.             ACE_Event_Handler::DONT_CALL;  
  39.         this->reactor ()->remove_handler (this, mask);  
  40.         this->sock_.close ();  
  41.         delete this;    //socket出错时,将自动删除该客户端,释放相应资源  
  42.         return 0;  
  43.     }  
  44.   
  45. protected:  
  46.     char buf[100];  
  47.     ACE_SOCK_Stream sock_;  
  48. };  
  49.   
  50.   
  51. class ClientAcceptor : public ACE_Event_Handler  
  52. {  
  53. public:  
  54.     virtual ~ClientAcceptor (){this->handle_close (ACE_INVALID_HANDLE, 0);}  
  55.   
  56.     int open (const ACE_INET_Addr &listen_addr)  
  57.     {  
  58.         if (this->acceptor_.open (listen_addr, 1) == -1)  
  59.         {  
  60.             printf("open port fail\n");  
  61.             return -1;  
  62.         }  
  63.         //注册接受连接回调事件  
  64.         return this->reactor ()->register_handler(this, ACE_Event_Handler::ACCEPT_MASK);  
  65.     }  
  66.   
  67.     virtual ACE_HANDLE get_handle (voidconst  
  68.     { return this->acceptor_.get_handle (); }  
  69.   
  70.     virtual int handle_input (ACE_HANDLE fd )  
  71.     {  
  72.         ClientService *client = new ClientService();  
  73.         auto_ptr<ClientService> p (client);  
  74.   
  75.         if (this->acceptor_.accept (client->peer ()) == -1)  
  76.         {  
  77.             printf("accept client fail\n");  
  78.             return -1;  
  79.         }  
  80.         p.release ();  
  81.         client->reactor (this->reactor ());  
  82.         if (client->open () == -1)  
  83.             client->handle_close (ACE_INVALID_HANDLE, 0);  
  84.         return 0;  
  85.     }  
  86.       
  87.     virtual int handle_close (ACE_HANDLE handle,  
  88.         ACE_Reactor_Mask close_mask)  
  89.     {  
  90.         if (this->acceptor_.get_handle () != ACE_INVALID_HANDLE)  
  91.         {  
  92.             ACE_Reactor_Mask m = ACE_Event_Handler::ACCEPT_MASK |  
  93.                 ACE_Event_Handler::DONT_CALL;  
  94.             this->reactor ()->remove_handler (this, m);  
  95.             this->acceptor_.close ();  
  96.         }  
  97.         return 0;  
  98.     }  
  99.   
  100. protected:  
  101.     ACE_SOCK_Acceptor acceptor_;  
  102. };  
  103.   
  104. int main(int argc, char *argv[])   
  105. {  
  106.     ACE_INET_Addr addr(3000,"127.0.0.1");  
  107.     ClientAcceptor server;  
  108.     server.reactor(ACE_Reactor::instance());  
  109.     server.open(addr);  
  110.   
  111.     while(true)  
  112.     {  
  113.         ACE_Reactor::instance()->handle_events();   
  114.     }  
  115.   
  116.     return 0;   
  117. }   


客户端代码:

  1. #include "ace/Reactor.h"  
  2. #include "ace/SOCK_Connector.h"  
  3.   
  4. #include <string>  
  5. #include <iostream>  
  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<<endl<<"connect fail.";  
  19.             return false;  
  20.         }  
  21.         ACE_Reactor::instance()->register_handler(this,ACE_Event_Handler::READ_MASK);  
  22.         cout<<endl<<"connected.";  
  23.         strcpy(buf, "hello,Server\n");  
  24.         peer.send(buf,strlen(buf));  
  25.         return true;  
  26.     }  
  27.   
  28.     ACE_HANDLE get_handle(voidconst  
  29.     {  
  30.         return peer.get_handle();  
  31.     }  
  32.   
  33.     int handle_input (ACE_HANDLE fd)  
  34.     {  
  35.         int rev=0;  
  36.         ACE_Time_Value timeout(5,0);  
  37.         if((rev=peer.recv(buf,sizeof(buf),&timeout))>0)  
  38.         {  
  39.             buf[rev]='\0';  
  40.             cout<<endl<<"recv: "<<buf<<endl;  
  41.         }  
  42.         return 3;  
  43.     }  
  44.   
  45. private:  
  46.     ACE_SOCK_Stream peer;  
  47.     char buf[100];  
  48. };  
  49.   
  50. int main(int argc, char *argv[])   
  51. {  
  52.     MyClient client;  
  53.     client.open();  
  54.   
  55.     while(true)  
  56.     {  
  57.         ACE_Reactor::instance()->handle_events();   
  58.     }  
  59.   
  60.     return 0;   
  61. }  


分别编译运行(先运行服务端,后运行客户端)下面是执行结果。

服务器:

recv: hello,Server

客户端:

connected.
recv: hello,Client

 

参考:

http://www.cnblogs.com/TianFang/archive/2006/12/13/591332.html

http://www.cnblogs.com/TianFang/archive/2006/12/18/595938.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值