acl  3.5.3.0
aio_socket_stream.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #if defined(_WIN32) || defined(_WIN64)
4 # include <WinSock2.h>
5 #endif
6 #include "aio_istream.hpp"
7 #include "aio_ostream.hpp"
8 
9 namespace acl
10 {
11 
12 /**
13  * 当异步客户端流异步连接远程服务器时的回调函数类,该类为纯虚类,
14  * 要求子类必须实现 open_callback 回调过程
15  */
17 {
18 public:
20  virtual ~aio_open_callback(void) {}
21 
22  virtual bool open_callback(void) = 0;
23 protected:
24 private:
25 };
26 
28 {
30  bool enable;
31 };
32 
33 class aio_handle;
34 
35 /**
36  * 网络异步流类,该类继承了异步读写流,同时该类只能在堆上分配,
37  * 不能在栈上分配,并且该类结束时应用不必释放该类对象,因为异步流
38  * 框架内部会自动释放该类对象,应用可以调用 close 主动关闭流
39  */
41  : public aio_istream
42  , public aio_ostream
43 {
44 public:
45  /**
46  * 构造函数,创建网络异步客户端流
47  * @param handle {aio_handle*} 异步引擎句柄
48  * @param stream {ACL_ASTREAM*} 非阻塞流
49  * @param opened {bool} 该流是否已经与服务端正常建立了连接,如果是则自动
50  * hook 读写过程及关闭/超时过程,否则仅 hook 关闭/超时过程
51  */
52  aio_socket_stream(aio_handle* handle, ACL_ASTREAM* stream, bool opened = false);
53 
54  /**
55  * 构造函数,创建网络异步客户端流,并 hook 读写过程及关闭/超时过程
56  * @param handle {aio_handle*} 异步引擎句柄
57  * @param fd {int} 连接套接口句柄
58  */
59 #if defined(_WIN32) || defined(_WIN64)
60  aio_socket_stream(aio_handle* handle, SOCKET fd);
61 #else
62  aio_socket_stream(aio_handle* handle, int fd);
63 #endif
64 
65  /**
66  * 打开与远程服务器的连接,并自动 hook 流的关闭、超时以及连接成功
67  * 时的回调处理过程
68  * @param handle {aio_handle*} 异步引擎句柄
69  * @param addr {const char*} 远程服务器的地址,地址格式为:
70  * 针对TCP:IP:Port 或 针对域套接口:{filePath}
71  * @param timeout {int} 连接超时时间(秒)
72  * @return {bool} 如果连接立即返回失败则该函数返回 false,如果返回
73  * true 只是表示正处于连接过程中,至于连接是否超时或连接是否失败
74  * 应通过回调函数来判断
75  */
76  static aio_socket_stream* open(aio_handle* handle,
77  const char* addr, int timeout);
78 
79  /**
80  * 添加针对 open 函数的回调过程
81  * @param callback {aio_open_callback*} 回调函数
82  */
83  void add_open_callback(aio_open_callback* callback);
84 
85  /**
86  * 从 open 回调对象集合中删除
87  * @param callback {aio_open_callback*} 被删除的回调对象,若该
88  * 值为空,则删除所有的回调对象
89  * @return {int} 返回被从回调对象集合中删除的回调对象的个数
90  */
91  int del_open_callback(aio_open_callback* callback = NULL);
92 
93  /**
94  * 禁止回调对象类集合中的某个回调类对象,但并不从回调类对象
95  * 集合中删除,只是不被调用而已
96  * @param callback {aio_open_callback*} 被禁止的回调对象,若该
97  * 值为空,则禁止所有的回调对象
98  * @return {int} 返回被从回调对象集合中禁用的回调对象的个数
99  */
100  int disable_open_callback(aio_open_callback* callback = NULL);
101 
102  /**
103  * 启用所有的回调对象被调用
104  * @param callback {aio_open_callback*} 启用指定的回调对象,
105  * 如果该值为空,则启用所有的回调对象
106  * @return {int} 返回被启用的回调对象的个数
107  */
108  int enable_open_callback(aio_open_callback* callback = NULL);
109 
110  /**
111  * 针对 open 过程,判断是否已经连接成功
112  * @return {bool} 返回 true 表示连接成功,否则表示还连接成功
113  */
114  bool is_opened(void) const;
115 
116 protected:
117  virtual ~aio_socket_stream(void);
118 
119  /**
120  * 通过此函数来动态释放只能在堆上分配的异步流类对象
121  */
122  virtual void destroy(void);
123 
124  /**
125  * 注册流连接成功的回调过程
126  */
127  void hook_open(void);
128 
129 private:
130  std::list<AIO_OPEN_CALLBACK*>* open_callbacks_;
131 
132  static int open_callback(ACL_ASTREAM*, void*);
133 };
134 
135 } // namespace acl
aio_open_callback * callback
virtual ~aio_open_callback(void)
#define ACL_CPP_API