acl  3.5.3.0
aio_stream.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include "../stdlib/noncopyable.hpp"
4 #include <list>
5 #include <string>
6 #if defined(_WIN32) || defined(_WIN64)
7 #include <WinSock2.h>
8 #endif
9 
10 struct ACL_ASTREAM;
11 struct ACL_VSTREAM;
12 
13 namespace acl
14 {
15 
16 /**
17  * 异步流回调类
18  */
20 {
21 public:
22  aio_callback(void) {}
23  virtual ~aio_callback(void) {};
24 
25  virtual void close_callback(void) {}
26  virtual bool timeout_callback(void)
27  {
28  return false;
29  }
30 
31  /**
32  * 读回调虚函数,该回调函数当满足了类 aio_istream 实例中的
33  * gets/read 的可读条件后被调用,由异步框架内部将符合条件的数
34  * 据读出,直接传递给用户的子类
35  * @param data {char*} 读到的数据的指针地址
36  * @param len {int} 读到的数据长度(> 0)
37  * @return {bool} 该函数返回 false 通知异步引擎关闭该异步流
38  */
39  virtual bool read_callback(char* data, int len)
40  {
41  (void) data;
42  (void) len;
43  return true;
44  }
45 
46  /**
47  * 读回调虚函数,该回调函数当满足了类 aio_istream 实例中的
48  * read_wait 的可读条件即异步流中有数据可读时被调用;当超时时会
49  * 调用 timeout_callback,流异常被关闭时会调用 close_callback
50  */
51  virtual bool read_wakeup(void)
52  {
53  return true;
54  }
55 
56  /**
57  * 写成功后的回调虚函数
58  * @return {bool} 该函数返回 false 通知异步引擎关闭该异步流
59  */
60  virtual bool write_callback(void)
61  {
62  return true;
63  }
64 
65  /**
66  * 读回调虚函数,该回调函数当满足了类 aio_ostream 实例中的
67  * write_wait 的可写条件即异步流可写时被调用;当超时时会
68  * 调用 timeout_callback,流异常被关闭时会调用 close_callback
69  */
70  virtual bool write_wakeup(void)
71  {
72  return true;
73  }
74 };
75 
76 struct AIO_CALLBACK
77 {
79  bool enable;
80 };
81 
82 class aio_handle;
83 class stream_hook;
84 
85 /**
86  * 异步流基类,该类为纯虚类,不能被直接实例化,只能被子类继承使用
87  * 该类只能在堆上分配,不能在栈上分配
88  */
90 {
91 public:
92  /**
93  * 构造函数
94  * @param handle {aio_handle*}
95  */
96  aio_stream(aio_handle* handle);
97 
98  /**
99  * 关闭异步流
100  */
101  void close(void);
102 
103  /**
104  * 添加关闭时的回调类对象指针,如果该回调类对象已经存在,则只是
105  * 使该对象处于打开可用状态
106  * @param callback {aio_callback*} 继承 aio_callback 的子类回调类对象,
107  * 当异步流关闭前会先调用此回调类对象中的 close_callback 接口
108  */
109  void add_close_callback(aio_callback* callback);
110 
111  /**
112  * 添加超时时的回调类对象指针,如果该回调类对象已经存在,则只是
113  * 使该对象处于打开可用状态
114  * @param callback {aio_callback*} 继承 aio_callback 的子类回调类对象,
115  * 当异步流关闭前会先调用此回调类对象中的 timeout_callback 接口
116  */
117  void add_timeout_callback(aio_callback* callback);
118 
119  /**
120  * 删除关闭时的回调类对象指针
121  * @param callback {aio_callback*} 从 aio_callback 继承的子类对象指针,
122  * 若该值为空,则删除所有的关闭回调对象
123  * @return {int} 返回被从回调对象集合中删除的回调对象的个数
124  */
125  int del_close_callback(aio_callback* callback = NULL);
126 
127  /**
128  * 删除超时时的回调类对象指针
129  * @param callback {aio_callback*} 从 aio_callback 继承的子类对象指针,
130  * 若该值为空,则删除所有的超时回调对象
131  * @return {int} 返回被从回调对象集合中删除的回调对象的个数
132  */
133  int del_timeout_callback(aio_callback* callback = NULL);
134 
135  /**
136  * 禁止关闭的回调类对象,但并不从关闭对象集合中删除
137  * @param callback {aio_callback*} 从 aio_callback 继承的子类对象指针,
138  * 若该值为空,则禁止所有的关闭回调对象
139  * @return {int} 返回被从回调对象集合中禁用的回调对象的个数
140  */
141  int disable_close_callback(aio_callback* callback = NULL);
142 
143  /**
144  * 禁止超时的回调类对象,但并不从超时对象集合中删除
145  * @param callback {aio_callback*} 从 aio_callback 继承的子类对象指针,
146  * 若该值为空,则禁止所有的超时回调对象
147  * @return {int} 返回被从回调对象集合中禁用的回调对象的个数
148  */
149  int disable_timeout_callback(aio_callback* callback = NULL);
150 
151  /**
152  * 启用所有的回调对象被调用
153  * @param callback {aio_callback*} 启用指定的回调对象,如果该值为空,
154  * 则启用所有的关闭回调对象
155  * @return {int} 返回被启用的回调对象的个数
156  */
157  int enable_close_callback(aio_callback* callback = NULL);
158 
159  /**
160  * 启用所有的回调对象被调用
161  * @param callback {aio_callback*} 启用指定的回调对象,如果该值为空,
162  * 则启用所有的超时回调对象
163  * @return {int} 返回被启用的回调对象的个数
164  */
165  int enable_timeout_callback(aio_callback* callback = NULL);
166 
167  /**
168  * 获得异步流对象 ACL_ASTREAM
169  * @return {ACL_ASTREAM*}
170  */
171  ACL_ASTREAM* get_astream(void) const;
172 
173  /**
174  * 获得异步流对象中的同步流对象 ACL_VSTREAM
175  * @return {ACL_VSTREAM*}
176  */
177  ACL_VSTREAM* get_vstream(void) const;
178 
179  /**
180  * 获得异步流中的 SOCKET 描述符
181  * @return {ACL_SOCKET} 若不存在则返回 -1(UNIX) 或 INVALID_SOCKET(win32)
182  */
183 #if defined(_WIN32) || defined(_WIN64)
184  SOCKET get_socket(void) const;
185  SOCKET sock_handle(void) const
186 #else
187  int get_socket(void) const;
188  int sock_handle(void) const
189 #endif
190  {
191  return get_socket();
192  }
193 
194  /**
195  * 获得远程连接的地址
196  * @param full {bool} 是否获得完整地址,即:IP:PORT,如果该参数
197  * 为 false,则仅返回 IP,否则返回 IP:PORT
198  * @return {const char*} 远程连接地址,若返回值 == '\0' 则表示
199  * 无法获得远程连接地址
200  */
201  const char* get_peer(bool full = false) const;
202 
203  /**
204  * 获得连接的本地地址
205  * @param full {bool} 是否获得完整地址,即:IP:PORT,如果该参数
206  * 为 false,则仅返回 IP,否则返回 IP:PORT
207  * @return {const char*} 该连接的本地地址,若返回值 == "" 则表示
208  * 无法获得本地地址
209  */
210  const char* get_local(bool full = false) const;
211 
212  /**
213  * 获得异步流事件句柄
214  * @return {aio_handle&}
215  */
216  aio_handle& get_handle(void) const;
217 
218  /**
219  * 注册读写流对象,内部自动调用 hook->open 过程,如果成功,则返回之前注册
220  * 的对象(可能为NULL),若失败则返回与输入参数相同的指针,应用可以通过判断
221  * 返回值与输入值是否相同来判断注册流对象是否成功
222  * xxx: 在调用此方法前必须保证流连接已经创建
223  * @param hook {stream_hook*} 非空对象指针
224  * @return {stream_hook*} 返回值与输入值不同则表示成功
225  */
226  stream_hook* setup_hook(stream_hook* hook);
227 
228  /**
229  * 获得当前注册的流读写对象
230  * @return {stream_hook*}
231  */
232  stream_hook* get_hook(void) const;
233 
234  /**
235  * 删除当前注册的流读写对象并返回该对象,恢复缺省的读写过程
236  * @return {stream_hook*}
237  */
238  stream_hook* remove_hook(void);
239 
240 protected:
244 
245  virtual ~aio_stream(void);
246 
247  /**
248  * 通过此函数来动态释放只能在堆上分配的异步流类对象
249  */
250  virtual void destroy(void);
251 
252  /**
253  * 子类应在创建成功后调用该函数通知基类增加异步流句柄数,
254  * 同时 hook 流关闭及流超时时的回调过程
255  */
256  void hook_error(void);
257 
258 protected:
259  enum {
260  // 是否调用了 hook_xxx 函数对应的标志位
261  STATUS_HOOKED_ERROR = 1,
262  STATUS_HOOKED_READ = 1 << 1,
263  STATUS_HOOKED_WRITE = 1 << 2,
264  STATUS_HOOKED_OPEN = 1 << 3,
265 
266  // 对于 aio_socket_stream 流表示是否连接已建立
267  STATUS_CONN_OPENED = 1 << 4,
268  };
269  unsigned status_;
270 private:
271  std::list<AIO_CALLBACK*>* close_callbacks_;
272  std::list<AIO_CALLBACK*>* timeout_callbacks_;
273 
274  static int close_callback(ACL_ASTREAM*, void*);
275  static int timeout_callback(ACL_ASTREAM*, void*);
276 
277 private:
278  std::string ip_peer_;
279  std::string ip_local_;
280 
281  const char* get_ip(const char* addr, std::string& out);
282 
283 private:
284 #if defined(_WIN32) || defined(_WIN64)
285  static int read_hook(SOCKET fd, void *buf, size_t len,
286  int timeout, ACL_VSTREAM* stream, void *ctx);
287  static int send_hook(SOCKET fd, const void *buf, size_t len,
288  int timeout, ACL_VSTREAM* stream, void *ctx);
289 
290  static int fread_hook(HANDLE fd, void *buf, size_t len,
291  int timeout, ACL_VSTREAM* stream, void *ctx);
292  static int fsend_hook(HANDLE fd, const void *buf, size_t len,
293  int timeout, ACL_VSTREAM* stream, void *ctx);
294 #else
295  static int read_hook(int fd, void *buf, size_t len,
296  int timeout, ACL_VSTREAM* stream, void *ctx);
297  static int send_hook(int fd, const void *buf, size_t len,
298  int timeout, ACL_VSTREAM* stream, void *ctx);
299 
300  static int fread_hook(int fd, void *buf, size_t len,
301  int timeout, ACL_VSTREAM* stream, void *ctx);
302  static int fsend_hook(int fd, const void *buf, size_t len,
303  int timeout, ACL_VSTREAM* stream, void *ctx);
304 #endif
305 };
306 
307 } // namespace acl
virtual void close_callback(void)
Definition: aio_stream.hpp:25
virtual bool read_wakeup(void)
Definition: aio_stream.hpp:51
virtual bool write_callback(void)
Definition: aio_stream.hpp:60
int sock_handle(void) const
Definition: aio_stream.hpp:188
aio_callback * callback
Definition: aio_stream.hpp:78
virtual ~aio_callback(void)
Definition: aio_stream.hpp:23
unsigned status_
Definition: aio_stream.hpp:269
ACL_ASTREAM * stream_
Definition: aio_stream.hpp:242
aio_handle * handle_
Definition: aio_stream.hpp:241
#define ACL_CPP_API
virtual bool read_callback(char *data, int len)
Definition: aio_stream.hpp:39
stream_hook * hook_
Definition: aio_stream.hpp:243
virtual bool write_wakeup(void)
Definition: aio_stream.hpp:70
virtual bool timeout_callback(void)
Definition: aio_stream.hpp:26