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

服务器代码:



[cpp] 
​​ view plain​​​
​​​ copy​​
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
8. {
9. public:
10. 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
21. {
22. int rev = peer().recv(buf,sizeof(buf));
23. if(rev<=0)
24. return
25. '\0';
26. "recv: %s",buf);
27. "hello,Client\n");
28. //向客户端发送信息。
29. return
30. }
31.
32. // 释放相应资源
33. virtual int
34. {
35. if
36. return
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
43. }
44.
45. protected:
46. char
47. ACE_SOCK_Stream sock_;
48. };
49.
50.
51. class ClientAcceptor : public
52. {
53. public:
54. virtual ~ClientAcceptor (){this->handle_close (ACE_INVALID_HANDLE, 0);}
55.
56. int open (const
57. {
58. if (this->acceptor_.open (listen_addr, 1) == -1)
59. {
60. "open port fail\n");
61. return
62. }
63. //注册接受连接回调事件
64. return this->reactor ()->register_handler(this, ACE_Event_Handler::ACCEPT_MASK);
65. }
66.
67. virtual ACE_HANDLE get_handle (void) const
68. return this->acceptor_.get_handle (); }
69.
70. virtual int
71. {
72. new
73. auto_ptr<ClientService> p (client);
74.
75. if (this->acceptor_.accept (client->peer ()) == -1)
76. {
77. "accept client fail\n");
78. return
79. }
80. p.release ();
81. this->reactor ());
82. if
83. client->handle_close (ACE_INVALID_HANDLE, 0);
84. return
85. }
86.
87. virtual int
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
98. }
99.
100. protected:
101. ACE_SOCK_Acceptor acceptor_;
102. };
103.
104. int main(int argc, char
105. {
106. "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
117. }


客户端代码:



[cpp] 
​​ view plain​​​
​​​ copy​​
1. #include "ace/Reactor.h"
2. #include "ace/SOCK_Connector.h"
3.
4. #include <string>
5. #include <iostream>
6. using namespace
7.
8. class MyClient:public
9. {
10. public:
11. bool
12. {
13. ACE_SOCK_Connector connector;
14. "127.0.0.1");
15. ACE_Time_Value timeout(5,0);
16. if(connector.connect(peer,addr,&timeout) != 0)
17. {
18. "connect fail.";
19. return false;
20. }
21. this,ACE_Event_Handler::READ_MASK);
22. "connected.";
23. "hello,Server\n");
24. peer.send(buf,strlen(buf));
25. return true;
26. }
27.
28. void) const
29. {
30. return
31. }
32.
33. int
34. {
35. int
36. ACE_Time_Value timeout(5,0);
37. if((rev=peer.recv(buf,sizeof(buf),&timeout))>0)
38. {
39. '\0';
40. "recv: "<<buf<<endl;
41. }
42. return
43. }
44.
45. private:
46. ACE_SOCK_Stream peer;
47. char
48. };
49.
50. int main(int argc, char
51. {
52. MyClient client;
53. client.open();
54.
55. while(true)
56. {
57. ACE_Reactor::instance()->handle_events();
58. }
59.
60. return
61. }


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

服务器:

recv: hello,Server

客户端:

connected.
recv: hello,Client

 

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

服务器代码:



[cpp] 
​​ view plain​​​
​​​ copy​​
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
8. {
9. public:
10. 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
21. {
22. int rev = peer().recv(buf,sizeof(buf));
23. if(rev<=0)
24. return
25. '\0';
26. "recv: %s",buf);
27. "hello,Client\n");
28. //向客户端发送信息。
29. return
30. }
31.
32. // 释放相应资源
33. virtual int
34. {
35. if
36. return
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
43. }
44.
45. protected:
46. char
47. ACE_SOCK_Stream sock_;
48. };
49.
50.
51. class ClientAcceptor : public
52. {
53. public:
54. virtual ~ClientAcceptor (){this->handle_close (ACE_INVALID_HANDLE, 0);}
55.
56. int open (const
57. {
58. if (this->acceptor_.open (listen_addr, 1) == -1)
59. {
60. "open port fail\n");
61. return
62. }
63. //注册接受连接回调事件
64. return this->reactor ()->register_handler(this, ACE_Event_Handler::ACCEPT_MASK);
65. }
66.
67. virtual ACE_HANDLE get_handle (void) const
68. return this->acceptor_.get_handle (); }
69.
70. virtual int
71. {
72. new
73. auto_ptr<ClientService> p (client);
74.
75. if (this->acceptor_.accept (client->peer ()) == -1)
76. {
77. "accept client fail\n");
78. return
79. }
80. p.release ();
81. this->reactor ());
82. if
83. client->handle_close (ACE_INVALID_HANDLE, 0);
84. return
85. }
86.
87. virtual int
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
98. }
99.
100. protected:
101. ACE_SOCK_Acceptor acceptor_;
102. };
103.
104. int main(int argc, char
105. {
106. "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
117. }


客户端代码:



[cpp] 
​​ view plain​​​
​​​ copy​
1. #include "ace/Reactor.h"
2. #include "ace/SOCK_Connector.h"
3.
4. #include <string>
5. #include <iostream>
6. using namespace
7.
8. class MyClient:public
9. {
10. public:
11. bool
12. {
13. ACE_SOCK_Connector connector;
14. "127.0.0.1");
15. ACE_Time_Value timeout(5,0);
16. if(connector.connect(peer,addr,&timeout) != 0)
17. {
18. "connect fail.";
19. return false;
20. }
21. this,ACE_Event_Handler::READ_MASK);
22. "connected.";
23. "hello,Server\n");
24. peer.send(buf,strlen(buf));
25. return true;
26. }
27.
28. void) const
29. {
30. return
31. }
32.
33. int
34. {
35. int
36. ACE_Time_Value timeout(5,0);
37. if((rev=peer.recv(buf,sizeof(buf),&timeout))>0)
38. {
39. '\0';
40. "recv: "<<buf<<endl;
41. }
42. return
43. }
44.
45. private:
46. ACE_SOCK_Stream peer;
47. char
48. };
49.
50. int main(int argc, char
51. {
52. MyClient client;
53. client.open();
54.
55. while(true)
56. {
57. ACE_Reactor::instance()->handle_events();
58. }
59.
60. return
61. }


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

服务器:

recv: hello,Server

客户端:

connected.
recv: hello,Client