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
*/
26
class
ACL_CPP_API
aio_timer_reader
:
public
aio_timer_callback
27
{
28
public
:
29
aio_timer_reader
(
void
) {}
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
acl::aio_timer_reader::aio_timer_reader
aio_timer_reader(void)
Definition:
aio_istream.hpp:29
acl::aio_istream
Definition:
aio_istream.hpp:60
aio_handle.hpp
acl
Definition:
acl_cpp_init.hpp:4
acl::aio_timer_reader
Definition:
aio_istream.hpp:26
acl::aio_timer_callback
Definition:
aio_timer_callback.hpp:15
acl::aio_handle
Definition:
aio_handle.hpp:29
acl::aio_callback
Definition:
aio_stream.hpp:19
acl::aio_timer_reader::destroy
virtual void destroy(void)
Definition:
aio_istream.hpp:34
acl::stream
Definition:
stream.hpp:24
acl::aio_stream
Definition:
aio_stream.hpp:89
ACL_CPP_API
#define ACL_CPP_API
Definition:
acl_cpp_define.hpp:16
aio_stream.hpp
ACL_ASTREAM
Definition:
acl_aio.h:138
aio_timer_callback.hpp
acl::aio_timer_reader::~aio_timer_reader
virtual ~aio_timer_reader(void)
Definition:
aio_istream.hpp:39
include
acl_cpp
stream
aio_istream.hpp
生成于 2021年 九月 10日 星期五 11:14:45 , 为 acl使用
1.8.15