acl
3.5.3.0
stream.hpp
浏览该文件的文档.
1
#pragma once
2
#include "../acl_cpp_define.hpp"
3
#include "../stdlib/string.hpp"
4
#include "../stdlib/noncopyable.hpp"
5
#include <map>
6
7
struct
ACL_VSTREAM
;
8
9
namespace
acl
{
10
11
/**
12
* 时间单位类型
13
*/
14
typedef
enum
{
15
time_unit_s
,
// 秒
16
time_unit_ms
,
// 毫秒
17
time_unit_us
,
// 微秒
18
time_unit_ns
,
// 纳秒
19
}
time_unit_t
;
20
21
class
stream_hook;
22
class
dbuf_pool;
23
24
class
ACL_CPP_API
stream
:
public
noncopyable
25
{
26
public
:
27
stream
(
void
);
28
virtual
~
stream
(
void
) = 0;
29
30
/**
31
* 调用本函数关闭流连接
32
* @return {bool} true: 关闭成功; false: 关闭失败
33
*/
34
bool
close(
void
);
35
36
/**
37
* 判断流是否已经结束
38
* @return {bool} true: 流已经结束; false: 流未结束
39
*/
40
bool
eof(
void
)
const
;
41
42
/**
43
* 清除流结束标志位,即将 eof_ 标志位置为 false
44
*/
45
void
clear_eof(
void
);
46
47
/**
48
* 当前流是否处理打开状态
49
* @return {bool} true: 流已经打开; false: 流未打开
50
*/
51
bool
opened(
void
)
const
;
52
53
/**
54
* 获得当前流的 ACL_VSTREAM 流对象
55
* @return {ACL_VSTREAM*}
56
*/
57
ACL_VSTREAM
* get_vstream(
void
)
const
;
58
59
/**
60
* 解绑 ACL_VSTREAM 与流对象的绑定关系,同时将 ACL_VSTREAM 返回
61
* 给用户,即将该 ACL_VSTREAM的管理权交给用户,本流对象在释放时
62
* 不会关闭该 ACL_VSTREAM ,但用户接管该 ACL_VSTREAM 后用完后
63
* 必须将其关闭;解绑后除了 close/open 的调用有意义外,其它的调用
64
* (包括流对象读写在内)都无意义
65
* @return {ACL_VSTREAM} 返回 NULL 表示流对象已经将 ACL_VSTREAM 解绑
66
*/
67
ACL_VSTREAM
* unbind(
void
);
68
69
/**
70
* 设置流的绑定对象
71
* @param ctx {void*}
72
* @param key {const char* } 标识该 ctx 的键
73
* @param replace {bool} 当对应的 KEY 存在时是否允许覆盖
74
* @return {bool} 当 replace 为 false 且 key 已经存在时则返回 false
75
*/
76
bool
set_ctx(
void
* ctx,
const
char
* key = NULL,
bool
replace =
true
);
77
78
/**
79
* 获得与流绑定的对象
80
* @param key {const char* key} 非空时使用该 key 查询对应的 ctx 对象,
81
* 否则返回缺省的 ctx 对象
82
* @return {void*}
83
*/
84
void
* get_ctx(
const
char
* key = NULL)
const
;
85
86
/**
87
* 删除流中绑定的对象
88
* @param key {const char*} 非空时删除对应该 key 的 ctx 对象,否则删除
89
* 缺省的 ctx 对象
90
* @return {void*} 当对象不存在时返回 NULL,成功删除后返回该对象
91
*/
92
void
* del_ctx(
const
char
* key = NULL);
93
94
/**
95
* 设置流的读写超时时间,只有当内部流对象建立后调用本方法才有效
96
* @param n {int} 超时时间,该值 > 0 则启用超时检测过程,否则将会一直阻塞直到
97
* 可读或出错,该值的单位取决 于第二个参数
98
*/
99
void
set_rw_timeout(
int
n);
100
101
/**
102
* 设置内部超时时间单位类型,只有当内部流对象建立后调用本方法才有效
103
* @param unit {time_unit_t} 时间单位类型
104
*/
105
void
set_time_unit(
time_unit_t
unit);
106
107
/**
108
* 获得当前流的读写超时时间
109
* @return {int} 获得流的读写超时时间(秒)
110
*/
111
int
get_rw_timeout(
void
)
const
;
112
113
/**
114
* 注册读写流对象,内部会自动调用 hook->open 过程,如果成功,则返回之前注册的对象
115
* (可能为NULL),若失败则返回与输入参数相同的指针,应用可以通过判断返回值与输入值
116
* 是否相同来判断注册流对象是否成功
117
* xxx: 在调用此方法前必须保证流连接已经创建
118
* @param hook {stream_hook*} 非空对象指针
119
* @return {stream_hook*} 返回值与输入值不同则表示成功
120
*/
121
stream_hook
* setup_hook(
stream_hook
* hook);
122
123
/**
124
* 获得当前注册的流读写对象
125
* @return {stream_hook*}
126
*/
127
stream_hook
* get_hook(
void
)
const
;
128
129
/**
130
* 删除当前注册的流读写对象并返回该对象,恢复缺省的读写过程
131
* @return {stream_hook*}
132
*/
133
stream_hook
* remove_hook(
void
);
134
135
public
:
136
/**
137
* 因为 stream 的生命周期较长,使用者使用 stream 对象中的内部缓存区可以
138
* 适当减少缓存区的频繁创建与释放
139
* @return {string&}
140
*/
141
string
& get_buf(
void
);
142
143
/**
144
* 获得与 stream 生命周期相同的 dbuf 内存分配器
145
* @return {dbuf_pool&}
146
*/
147
dbuf_pool
& get_dbuf(
void
);
148
149
protected
:
150
/**
151
* 打开流对象,如果流已经打开,则不会重复打开
152
*/
153
void
open_stream(
bool
is_file =
false
);
154
155
/**
156
* 重新打开流对象,如果流已经打开则先释放流对象再打开
157
*/
158
void
reopen_stream(
bool
is_file =
false
);
159
160
protected
:
161
stream_hook
*
hook_
;
162
ACL_VSTREAM
*
stream_
;
163
string
*
buf_
;
164
dbuf_pool
*
dbuf_
;
165
166
void
*
default_ctx_
;
167
std::map<string, void*>*
ctx_table_
;
168
169
bool
eof_
;
170
bool
opened_
;
171
172
private
:
173
#if defined(_WIN32) || defined(_WIN64)
174
static
int
read_hook(SOCKET fd,
void
*buf,
size_t
len,
175
int
timeout,
ACL_VSTREAM
*
stream
,
void
*ctx);
176
static
int
send_hook(SOCKET fd,
const
void
*buf,
size_t
len,
177
int
timeout,
ACL_VSTREAM
*
stream
,
void
*ctx);
178
179
static
int
fread_hook(HANDLE fd,
void
*buf,
size_t
len,
180
int
timeout,
ACL_VSTREAM
*
stream
,
void
*ctx);
181
static
int
fsend_hook(HANDLE fd,
const
void
*buf,
size_t
len,
182
int
timeout,
ACL_VSTREAM
*
stream
,
void
*ctx);
183
#else
184
static
int
read_hook(
int
fd,
void
*buf,
size_t
len,
185
int
timeout,
ACL_VSTREAM
*
stream
,
void
*ctx);
186
static
int
send_hook(
int
fd,
const
void
*buf,
size_t
len,
187
int
timeout,
ACL_VSTREAM
*
stream
,
void
*ctx);
188
189
static
int
fread_hook(
int
fd,
void
*buf,
size_t
len,
190
int
timeout,
ACL_VSTREAM
*
stream
,
void
*ctx);
191
static
int
fsend_hook(
int
fd,
const
void
*buf,
size_t
len,
192
int
timeout,
ACL_VSTREAM
*
stream
,
void
*ctx);
193
#endif
194
};
195
196
}
// namespace acl
acl::stream::buf_
string * buf_
Definition:
stream.hpp:163
acl::stream::stream_
ACL_VSTREAM * stream_
Definition:
stream.hpp:162
acl::time_unit_ms
Definition:
stream.hpp:16
acl::time_unit_us
Definition:
stream.hpp:17
acl::time_unit_s
Definition:
stream.hpp:15
acl::stream::default_ctx_
void * default_ctx_
Definition:
stream.hpp:166
acl
Definition:
acl_cpp_init.hpp:4
acl::noncopyable
Definition:
noncopyable.hpp:6
acl::stream::ctx_table_
std::map< string, void * > * ctx_table_
Definition:
stream.hpp:167
acl::time_unit_t
time_unit_t
Definition:
stream.hpp:14
acl::stream::eof_
bool eof_
Definition:
stream.hpp:169
acl::stream_hook
Definition:
stream_hook.hpp:14
acl::time_unit_ns
Definition:
stream.hpp:18
acl::stream::opened_
bool opened_
Definition:
stream.hpp:170
acl::stream
Definition:
stream.hpp:24
acl::stream::hook_
stream_hook * hook_
Definition:
stream.hpp:161
acl::dbuf_pool
Definition:
dbuf_pool.hpp:17
ACL_VSTREAM
Definition:
acl_vstream.h:66
ACL_CPP_API
#define ACL_CPP_API
Definition:
acl_cpp_define.hpp:16
acl::stream::dbuf_
dbuf_pool * dbuf_
Definition:
stream.hpp:164
include
acl_cpp
stream
stream.hpp
生成于 2021年 九月 10日 星期五 11:14:45 , 为 acl使用
1.8.15