ACE Reactor框架:
只要做三件事:
1.从ACE_Event_Handler派生一个或多个类,并给各个虚回调方法增加应用特有的事件处理行为
2.向ACE_Reactor类登记应用的事件处理对象,把每个事件处理对象与它感兴趣的事件关联起来
3.运行ACE_Reactor事件循环
一个接受连接的例子:
1.#include <iostream> 2.#include "ace/auto_ptr.h" 3.#include "ace/log_msg.h" 4.#include "ace/inet_addr.h" 5.#include "ace/sock_acceptor.h" 6.#include "ace/reactor.h" 7.8.#include "ace/Message_Block.h" 9.#include "ace/Message_Queue.h" 10.#include "ace/SOCK_Stream.h" 11.12.#include "ace/Null_Mutex.h" 13.#include "ace/Null_Condition.h" 14.15.16.using namespace std;
17.//服务客户 18.class ClientService:public ACE_Event_Handler
19.{
20.public:
21. ACE_SOCK_Stream &peer(void)
22. {
23. return this->sock_;
24. }
25. int open(void);
26. virtual ACE_HANDLE get_handle(void) const27. {
28. return this->sock_.get_handle();
29. }
30. virtual int handle_input(ACE_HANDLE fd=ACE_INVALID_HANDLE);
31. virtual int handle_output(ACE_HANDLE fd=ACE_INVALID_HANDLE);
32. virtual int handle_close(ACE_HANDLE handle,ACE_Reactor_Mask close_mask);
33.34.protected:
35. ACE_SOCK_Stream sock_;
36. ACE_Message_Queue<ACE_NULL_SYNCH> output_queue_;
37.};
38.int ClientService::open(void)
39.{
40. ACE_TCHAR peer_name[512];
41. ACE_INET_Addr peer_addr;
42. if(this->sock_.get_remote_addr(peer_addr)==0&&peer_addr.addr_to_string(peer_name,512)==0)
43. cout<<" connection from "<<peer_name<<endl;
44. return this->reactor()->register_handler(this,ACE_Event_Handler::READ_MASK);
45.}
46.int ClientService::handle_input(ACE_HANDLE)
47.{
48. const size_t INPUT_SIZE=4096;
49. char buffer[INPUT_SIZE];
50. ssize_t recv_cnt,send_cnt;
51. if((recv_cnt=this->sock_.recv(buffer,sizeof(buffer)))<=0)
52. {
53. ACE_DEBUG((LM_DEBUG,ACE_TEXT("(%P|%t) connection closed/n")));
54. return -1;