acl  3.5.3.0
aio_istream.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <list>
4 #include "aio_handle.hpp"
5 #include "aio_timer_callback.hpp"
6 #include "aio_stream.hpp"
7 
8 namespace acl
9 {
10 
11 class aio_istream;
12 
13 /**
14  * 延迟异步读数据类,基类为 aio_timer_callback (see aio_handle.hpp),
15  * 所谓延迟异步读,就是把异步读流(aio_istream)放在定时器中,将该异
16  * 步流的异步读操作解除绑定(即从 aio_handle 的监控中解除),当指定
17  * 时间到达后再启动异步读操作(在 timer_callback 回调中再重新将异步
18  * 流的异步读操作绑定),同时该定时器自动销毁(调用 destroy 方法),
19  * 所以如果用户继承了 aio_timer_reader 类,且子类不是在堆上分配的,
20  * 则必须重载 destroy方法,同时在子类的 destroy 中执行与资源释放的
21  * 相关操作,如果子类未重载 destroy,则当定时器结束后内部会自动调用
22  * 基类 aio_timer_reader 的 destroy--该类调用了 delete this,此时就
23  * 会导致非法内存释放操作)
24  *
25  */
27 {
28 public:
30 
31  /**
32  * 在 aio_istream 中调用此函数以释放类对象,子类应该实现该函数
33  */
34  virtual void destroy(void)
35  {
36  delete this;
37  }
38 protected:
39  virtual ~aio_timer_reader(void) {}
40  /**
41  * 延迟读数据时的回调函数,从 aio_timer_callback 类中继承而来
42  */
43  virtual void timer_callback(unsigned int id);
44 private:
45  // 允许 aio_istream 可以直接修改本类的私有成员变量
46  friend class aio_istream;
47 
48  aio_istream* in_;
49  //int read_delayed_;
50  bool delay_gets_;
51  int delay_timeout_;
52  bool delay_nonl_;
53  int delay_count_;
54 };
55 
56 /**
57  * 异步读数据流类定义,该类只能在堆上被实例化,在析构时需要调用 close
58  * 函数以释放该类对象
59  */
60 class ACL_CPP_API aio_istream : virtual public aio_stream
61 {
62 public:
63  /**
64  * 构造函数
65  * @param handle {aio_handle*} 异步事件引擎句柄
66  */
67  aio_istream(aio_handle* handle);
68 
69  /**
70  * 构造函数,创建异步读流对象,并 hook 读过程及关闭/超时过程
71  * @param handle {aio_handle*} 异步事件引擎句柄
72  * @param fd {int} 连接套接口句柄
73  */
74 #if defined(_WIN32) || defined(_WIN64)
75  aio_istream(aio_handle* handle, SOCKET fd);
76 #else
77  aio_istream(aio_handle* handle, int fd);
78 #endif
79 
80  /**
81  * 添加异可读时的回调类对象指针,如果该回调类对象已经存在,则只是
82  * 使该对象处于打开可用状态
83  * @param callback {aio_callback*} 继承 aio_callback 的子类回调类对象,
84  * 当异步流有数据时会先调用此回调类对象中的 read_callback 接口
85  */
86  void add_read_callback(aio_callback* callback);
87 
88  /**
89  * 从读回调对象集合中删除
90  * @param callback {aio_read_callback*} 被删除的回调对象,
91  * 若该值为空,则删除所有的回调对象
92  * @return {int} 返回被从回调对象集合中删除的回调对象的个数
93  */
94 
95  /**
96  * 从读回调对象集合中删除回调对象
97  * @param callback {aio_callback*} 从 aio_callback 继承的子类对象指针,
98  * 若该值为空,则删除所有的读回调对象
99  * @return {int} 返回被从回调对象集合中删除的回调对象的个数
100  */
101  int del_read_callback(aio_callback* callback = NULL);
102 
103  /**
104  * 禁止回调对象类集合中的某个回调类对象,但并不从回调类对象
105  * 集合中删除,只是不被调用而已
106  * @param callback {aio_callback*} 从 aio_callback 继承的子类对象指针,
107  * 若该值为空,则禁止所有的读回调对象
108  * @return {int} 返回被从回调对象集合中禁用的回调对象的个数
109  */
110  int disable_read_callback(aio_callback* callback = NULL);
111 
112  /**
113  * 启用所有的回调对象被调用
114  * @param callback {aio_callback*} 从 aio_callback 继承的子类对象指针,
115  * 若该值为空,则启用所有的读回调对象
116  * @return {int} 返回被启用的回调对象的个数
117  */
118  int enable_read_callback(aio_callback* callback = NULL);
119 
120  /**
121  * 异步读取一行数据,当延迟异步读时,如果连续调用此过程,
122  * 则只有最后一个延迟读操作生效
123  * @param timeout {int} 读超时时间(秒),若为 0 则表示
124  * 永远等待直到读到完整一行数据或出错
125  * @param nonl {bool} 是否自动去掉尾部的回车换行符
126  * @param delay {int64} 如果对方发送数据比较快时,此参数
127  * 大于 0 时可以延迟接收对方的数据,该值控制延迟读数据
128  * 的时间(单位为微秒)
129  * @param callback {aio_timer_reader*} 定时器到达时的回调函数类对象,
130  * 当 delay > 0,如果该值为空,则采用缺省的对象
131  */
132 #if defined(_WIN32) || defined(_WIN64)
133  void gets(int timeout = 0, bool nonl = true,
134  __int64 delay = 0, aio_timer_reader* callback = NULL);
135 #else
136  void gets(int timeout = 0, bool nonl = true,
137  long long int delay = 0, aio_timer_reader* callback = NULL);
138 #endif
139 
140  /**
141  * 异步读取数据,当延迟异步读时,如果连续调用此过程,
142  * 则只有最后一个延迟读操作生效
143  * @param count {int} 所要求读到的数据量,如果为 0 则只要有数据
144  * 可读就返回,否则直到读超时或读出错或读满足所要求的字节数
145  * @param timeout {int} 读超时时间(秒),若为 0 则表示
146  * 永远等待直到读到所要求的数据或出错
147  * @param delay {int64} 如果对方发送数据比较快时,此参数
148  * 大于 0 时可以延迟接收对方的数据,该值控制延迟读数据
149  * 的时间(单位为微秒)
150  * @param callback {aio_timer_reader*} 定时器到达时的回调函数类对象,
151  * 如果该值为空,则采用缺省的对象
152  */
153 #if defined(_WIN32) || defined(_WIN64)
154  void read(int count = 0, int timeout = 0,
155  __int64 delay = 0, aio_timer_reader* callback = NULL);
156 #else
157  void read(int count = 0, int timeout = 0,
158  long long int delay = 0, aio_timer_reader* callback = NULL);
159 #endif
160 
161  /**
162  * 异步等待连接流可读,该函数设置异步流的读监听状态,当有数据可读
163  * 时,回调函数被触发,由用户自己负责数据的读取
164  * @param timeout {int} 读超时时间(秒),当该值为 0 时,则没有读超时
165  */
166  void read_wait(int timeout = 0);
167 
168  /**
169  * 禁止异步流的异步读状态,将该异步流从异步引擎的监控中
170  * 移除,直到用户调用任何一个异步读操作(此时,异步引擎会
171  * 自动重新监控该流的可读状态)
172  */
173  void disable_read(void);
174 
175  /**
176  * 设置流是否采用连接读功能
177  * @param onoff {bool}
178  */
179  void keep_read(bool onoff);
180 
181  /**
182  * 获得流是否是设置了连续读功能
183  * @return {bool}
184  */
185  bool keep_read(void) const;
186 
187  /**
188  * 设置接收缓冲区的最大长度,以避免缓冲区溢出,默认值为 0 表示不限制
189  * @param max {int}
190  * @return {aio_istream&}
191  */
192  aio_istream& set_buf_max(int max);
193 
194  /**
195  * 获得当前接收缓冲区的最大长度限制
196  * @return {int} 返回值 <= 0 表示没有限制
197  */
198  int get_buf_max(void) const;
199 
200 protected:
201  virtual ~aio_istream(void);
202 
203  /**
204  * 释放动态类对象的虚函数
205  */
206  virtual void destroy(void);
207 
208  /**
209  * 注册可读的回调函数
210  */
211  void hook_read(void);
212 
213 private:
214  friend class aio_timer_reader;
215  aio_timer_reader* timer_reader_;
216  std::list<AIO_CALLBACK*> read_callbacks_;
217 
218  static int read_callback(ACL_ASTREAM*, void*, char*, int);
219  static int read_wakeup(ACL_ASTREAM* stream, void* ctx);
220 };
221 
222 } // namespace acl
virtual void destroy(void)
Definition: aio_istream.hpp:34
#define ACL_CPP_API
virtual ~aio_timer_reader(void)
Definition: aio_istream.hpp:39