acl  3.5.3.0
acl_aio.h
浏览该文件的文档.
1 /**
2  * @file acl_aio.h
3  * @author zsx
4  * @date 2010-1-2
5  * @brief 本文件中定义了关于 ACL_ASTREAM 异步通信流操作的类型说明及函数接口.
6  * @version 1.1
7  */
8 
9 #ifndef ACL_AIO_INCLUDE_H
10 #define ACL_AIO_INCLUDE_H
11 
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15 
16 #include "../stdlib/acl_define.h"
17 #include <stdarg.h>
18 #ifdef ACL_UNIX
19 #include <sys/uio.h>
20 #endif
21 
22 #include "../stdlib/acl_stdlib.h"
23 #include "../event/acl_events.h"
24 #include "../net/acl_netdb.h"
25 
26 /*------------------------------- 数据结构类型定义 ---------------------------*/
27 
28 /**
29  * 异步框架引擎句柄类型定义
30  */
31 typedef struct ACL_AIO ACL_AIO;
32 
33 /**
34  * 异步流类型定义
35  */
36 typedef struct ACL_ASTREAM ACL_ASTREAM;
37 
38 /**
39  * 事件通知函数句柄类型, 当某个受监控的流有数据可读或出错时的回调用户的注册函数,
40  * 目前用与该类型相关的异步函数有:
41  * acl_aio_gets, acl_aio_gets_nonl, acl_aio_read, acl_aio_readn.
42  * @param astream {ACL_ASTREAM*} 异步流指针
43  * @param context {void*} 用户级传递的参数
44  * @param data {const char*} 从流中读取的数据指针
45  * @param dlen {int} data 数据的长度
46  * @return {int} 该函数指针调用如果返回-1则表明应用要求关闭异步流
47  */
48 typedef int (*ACL_AIO_READ_FN)(ACL_ASTREAM *astream,
49  void *context, char *data, int dlen);
50 
51 /**
52  * 事件通知函数句柄类型,当某个异步流可读/可写时调用此类型的用户回调函数
53  * @param astream {ACL_ASTREAM*} 异步流指针
54  * @param context {void*} 用户级传递的参数
55  * @return {int} 如果该函数类型返回 -1 则表明应用要求关闭异步流
56  */
57 typedef int (*ACL_AIO_NOTIFY_FN)(ACL_ASTREAM *astream, void *context);
58 
59 /**
60  * 事件通知函数句柄类型, 当某个受监控的流将数据写完或出错时的回调用户的注册函数,
61  * 目前用与该类型相关的异步函数有:
62  * acl_aio_writen, acl_aio_writev, acl_aio_fprintf, acl_aio_vfprintf.
63  * @param astream {ACL_ASTREAM*} 异步流指针
64  * @param context {void*} 用户级传递的参数
65  * @return {int} 该函数指针调用如果返回-1则表明应用要求关闭异步流
66  */
67 typedef int (*ACL_AIO_WRITE_FN)(ACL_ASTREAM *astream, void *context);
68 
69 /**
70  * 当某个监听描述符有新的客户端连接时, 异步框架接收该连接并传递给用户; 如果出错,
71  * 若用户设置了该监听流的监听超时值且到达该超时值, 则也会触发该函数类型句柄. 与该函数
72  * 类型句柄相关的异步函数有: acl_aio_accept.
73  * @param cstream {ACL_ASTREAM*} 从 sstream 监听流通过 accept() 获得的客户端连接流
74  * @param context {void*} 用户级传递的参数
75  * @return {int} 如果该函数调用返回 -1 表示不再继续接收新的客户端连接
76  */
77 typedef int (*ACL_AIO_ACCEPT_FN)(ACL_ASTREAM *cstream, void *context);
78 
79 /**
80  * 当某个监听描述符上有新的客户端连接时, 异步框架回调用用户的注册函数, 用户需要从
81  * 该监听流上 accept 该客户端连接. 与该函数类型相关的异步函数有: acl_aio_listen.
82  * @param sstream {ACL_ASTREAM*} 监听流句柄
83  * @param context {void*} 用户级传递的参数
84  * @return {int} 如果该函数的调用返回-1,并不影响监听流继续监听
85  * 注: 请注意该函数类型与 ACL_AIO_ACCEPT_FN 的功能差别.
86  */
87 typedef int (*ACL_AIO_LISTEN_FN)(ACL_ASTREAM *sstream, void *context);
88 
89 /**
90  * 异步连接远程服务器时, 当连接失败、超时或成功时的事件通知句柄类型
91  * 将回调用户的注册函数. 与该函数类型相关的异步函数有: acl_aio_connect.
92  * @param cstream {ACL_ASTREAM*} 受监控的正处于连接状态的客户端流
93  * @param context {void*} 用户级传递的参数
94  * @return {int} 若调用该函数返回-1则需要关闭该异步连接流
95  */
96 typedef int (*ACL_AIO_CONNECT_FN)(ACL_ASTREAM *cstream, void *context);
97 
99 
100 ACL_API int acl_astream_get_status(const ACL_ASTREAM_CTX *ctx);
101 #define ACL_ASTREAM_STATUS_INVALID -1
102 #define ACL_ASTREAM_STATUS_OK 0
103 #define ACL_ASTREAM_STATUS_NS_ERROR 1
104 #define ACL_ASTREAM_STATUS_CONNECT_ERROR 2
105 #define ACL_ASTREAM_STATUS_CONNECT_TIMEOUT 3
106 
107 ACL_API const ACL_SOCKADDR *acl_astream_get_ns_addr(const ACL_ASTREAM_CTX *ctx);
108 ACL_API const ACL_SOCKADDR *acl_astream_get_serv_addr(const ACL_ASTREAM_CTX *ctx);
110 ACL_API void *acl_astream_get_ctx(const ACL_ASTREAM_CTX *ctx);
111 
112 /**
113  * 异步连接远程服务器时的回调函数定义,该类型由 acl_aio_connect_addr() 使用
114  * @param ctx {ACL_ASTREAM_CTX*} 回调函数的参数,可以由 acl_astream_get_xxx
115  * 获得该对象中包含的对象指针
116  */
117 typedef int (*ACL_AIO_CONNECT_ADDR_FN)(const ACL_ASTREAM_CTX *ctx);
118 
119 /**
120  * “读、写、监听”超时的回调函数指针
121  * @param astream {ACL_ASTREAM*} 异步流指针
122  * @param context {void*} 用户传递的参数
123  * @return {int} 当该函数调用返回-1时,对于读写流表示需要关闭该异步读写流,
124  * 对于监听流表示不再继续接收新的客户端连接;当返回0时,表示继续
125  */
126 typedef int (*ACL_AIO_TIMEO_FN)(ACL_ASTREAM *astream, void *context);
127 
128 /**
129  * 当需要关闭异步读写流时需要回调用用户注册的函数
130  * @param astream {ACL_ASTREAM*} 异步流指针
131  * @param context {void*} 用户传递的参数
132  * @return {int} 无论该值如何,该异步流都需要被关闭
133  */
134 typedef int (*ACL_AIO_CLOSE_FN)(ACL_ASTREAM *astream, void *context);
135 
136 /* 异步流类型定义 */
137 
138 struct ACL_ASTREAM {
139  ACL_AIO *aio; /**< 异步流事件句柄 */
140  ACL_VSTREAM *stream; /**< 同步流 */
141 
142  ACL_VSTRING strbuf; /**< 内部缓冲区 */
143  int timeout; /**< IO超时时间 */
144  int nrefer; /**< 通过此引用计数防止流被提前关闭 */
145  int flag; /**< 标志位 */
146 #define ACL_AIO_FLAG_IOCP_CLOSE (1 << 0)
147 #define ACL_AIO_FLAG_ISRD (1 << 1)
148 #define ACL_AIO_FLAG_ISWR (1 << 2)
149 #define ACL_AIO_FLAG_DELAY_CLOSE (1 << 3)
150 #define ACL_AIO_FLAG_DEAD (1 << 4)
151 
152  ACL_FIFO write_fifo; /**< 异步写时的先进先出队列数据 */
153  int write_left; /**< 写缓冲中未写完的数据量 */
154  int write_offset; /**< 写缓冲中的下一个位置偏移 */
155  int write_nested; /**< 写时的嵌套层数 */
156  int write_nested_limit; /**< 写时的嵌套层数限制 */
157 
158  int (*read_ready_fn) (ACL_VSTREAM *, ACL_VSTRING *, int *);
159  int read_nested; /**< 读时的嵌套层数 */
160  int read_nested_limit; /**< 读时的嵌套层数限制 */
161  int count; /**< 调用 acl_aio_readn()/2 时设置的第二个参数值 */
162  int keep_read; /**< 是否启用持续性读 */
163  int accept_nloop; /**< acl_aio_accept 内部循环 accept 的最大次数 */
164  int error; /**< 当前套接口的错误号 */
165  int line_length; /**< 当以行为单位读数据时该值限制每行最大长度 */
166 
167  ACL_AIO_ACCEPT_FN accept_fn; /**< accept 完成时的回调函数 */
168  ACL_AIO_LISTEN_FN listen_fn; /**< 有新连接到达时的回调函数 */
169  void *context; /**< 用户设置的参数 */
170 
171  ACL_AIO_NOTIFY_FN can_read_fn; /**< 可以读时的回调函数 */
172  void *can_read_ctx; /**< can_read_fn 参数之一 */
173  ACL_AIO_NOTIFY_FN can_write_fn; /**< 可以写时的回调函数 */
174  void *can_write_ctx; /**< can_write_fn 参数之一 */
175 
176  ACL_ARRAY *read_handles; /**< 读完成时的辅助回调函数 */
177  ACL_ARRAY *write_handles; /**< 写完成时的辅助回调函数 */
178  ACL_ARRAY *close_handles; /**< 关闭时的辅助回调函数 */
179  ACL_ARRAY *timeo_handles; /**< 超时时的辅助回调函数 */
180  ACL_ARRAY *connect_handles; /**< 连接成功时辅助回调函数 */
181  ACL_FIFO reader_fifo; /**< 临时存放回调函数 */
182  ACL_FIFO writer_fifo; /**< 临时存放回调函数 */
183 
184  /* 可读时的回调函数 */
185  void (*event_read_callback)(int event_type, ACL_ASTREAM *astream);
186 };
187 
188 /**
189  * 设置流的IO超时时间
190  */
191 #define ACL_AIO_SET_TIMEOUT(stream_ptr, _timeo_) do { \
192  ACL_ASTREAM *__stream_ptr = stream_ptr; \
193  __stream_ptr->timeout = _timeo_; \
194 } while(0)
195 
196 /**
197  * 设置流的 context 参数
198  */
199 #define ACL_AIO_SET_CTX(stream_ptr, _ctx_) do { \
200  ACL_ASTREAM *__stream_ptr = stream_ptr; \
201  __stream_ptr->context = _ctx_; \
202 } while(0)
203 
204 /*--------------------------- 异步操作公共接口 -------------------------------*/
205 
206 /**
207  * 创建一个异步通信的异步框架实例句柄, 可以指定是否采用 epoll/devpoll
208  * @param event_mode {int} 事件监听方式: ACL_EVENT_SELECT, ACL_EVENT_POLL
209  * , ACL_EVENT_KERNEL, ACL_EVENT_WMSG
210  * @return {ACL_AIO*} 返回一个异步框架引擎句柄. OK: != NULL; ERR: == NULL.
211  */
212 ACL_API ACL_AIO *acl_aio_create(int event_mode);
213 
214 /**
215  * 创建异步框架实例句柄, 可以指定是否采用 epoll/devpoll/windows message
216  * @param event_mode {int} 事件监听方式: ACL_EVENT_SELECT, ACL_EVENT_POLL
217  * , ACL_EVENT_KERNEL, ACL_EVENT_WMSG
218  * @param nMsg {unsigned int} 当与 _WIN32 界面的消息整合时,即 event_mode 设为
219  * ACL_EVENT_WMSG 时该值才有效,其表示与异步句柄绑定的消息值
220  * @return {ACL_AIO*} 返回一个异步框架引擎句柄. OK: != NULL; ERR: == NULL.
221  */
222 ACL_API ACL_AIO *acl_aio_create2(int event_mode, unsigned int nMsg);
223 
224 /**
225  * 根据事件引擎句柄创建异步对象句柄
226  * @param event {ACL_EVENT *}
227  * @return {ACL_AIO *}
228  */
229 ACL_API ACL_AIO *acl_aio_create3(ACL_EVENT *event);
230 
231 /**
232  * 获得本 aio 句柄所绑定的 DNS 查询对象
233  * @param aio {ACL_AIO*}
234  * @return {ACL_DNS*} 返回 NULL 表示没有绑定 DNS 查询对象,当返回值非 NULL 时,应用可
235  * 以直接将返回值转换为 ACL_DNS 对象(XXX:因为循环引用头文件的问题,所以暂且如此)
236  */
237 ACL_API void *acl_aio_dns(ACL_AIO *aio);
238 
239 /**
240  * 设置 DNS 服务器地址列表,只有设置了 DNS 服务器地址,内部才会支持域名解析并
241  * 异步连接服务器地址
242  * @param aio {ACL_AIO*}
243  * @param dns_list {const char*} DNS 服务器地址列表,格式:ip1:port,ip2:port...
244  * @param timeout {int} 域名解析超时时间(秒)
245  * @return {int} 设置 DNS 查询对象是否成功,0 表示成功,-1 表示失败,失败原因
246  * 有:无法创建 UDP 套接字或绑定 UDP 套接字失败
247  */
248 ACL_API int acl_aio_set_dns(ACL_AIO *aio, const char *dns_list, int timeout);
249 
250 /**
251  * 删除 DNS 服务器地址列表
252  * @param aio {ACL_AIO*}
253  * @param dns_list {const char*} DNS 服务器地址列表,格式:ip1:port,ip2:port...
254  */
255 ACL_API void acl_aio_del_dns(ACL_AIO *aio, const char *dns_list);
256 
257 /**
258  * 将 aio 句柄中绑定的 DNS 地址清理掉
259  * @param aio {ACL_AIO*}
260  */
261 ACL_API void acl_aio_clear_dns(ACL_AIO *aio);
262 
263 /**
264  * 释放一个异步通信异步框架实例句柄,同时会释放掉非空的 aio->event 对象
265  * @param aio {ACL_AIO*} 异步框架引擎句柄
266  */
267 ACL_API void acl_aio_free(ACL_AIO *aio);
268 
269 /**
270  * 释放一个异步通信异步框架实例句柄
271  * @param keep {int} 是否同时释放掉 aio 所绑定的 event 事件句柄
272  * @param aio {ACL_AIO*} 异步框架引擎句柄
273  */
274 ACL_API void acl_aio_free2(ACL_AIO *aio, int keep);
275 
276 /**
277  * 异步IO消息循环(仅在单线程模式下调用)
278  * @param aio {ACL_AIO*} 异步框架引擎句柄
279  */
280 ACL_API void acl_aio_loop(ACL_AIO *aio);
281 
282 /**
283  * 获得本次事件循环被触发的事件次数
284  * @param aio {ACL_AIO*} 异步框架引擎句柄
285  * @return {int} -1 表示输入参数有误,否则返回值 >= 0
286  */
287 ACL_API int acl_aio_last_nready(ACL_AIO *aio);
288 
289 /**
290  * 主动检查 ACL_AIO 引擎中待关闭的异步流是否应该关闭,调用此函数后,一些需要
291  * 延迟关闭的异步流会被主动关闭
292  * @param aio {ACL_AIO*} 异步框架引擎句柄
293  */
294 ACL_API void acl_aio_check(ACL_AIO *aio);
295 
296 /**
297  * 获得事件引擎的句柄
298  * @param aio {ACL_AIO*} 异步框架引擎句柄
299  * @return {ACL_EVENT*}
300  */
301 ACL_API ACL_EVENT *acl_aio_event(ACL_AIO *aio);
302 
303 /**
304  * 获得事件所采用的模式
305  * @param aio {ACL_AIO*} 异步框架引擎句柄
306  * @return {int} ACL_EVENT_KERNEL/ACL_EVENT_SELECT/ACL_EVENT_POLL
307  */
308 ACL_API int acl_aio_event_mode(ACL_AIO *aio);
309 
310 /**
311  * 异步IO框架是否是采用持续读模式
312  * @param aio {ACL_AIO*} 异步框架引擎句柄
313  * @return {int} != 0: 是; == 0: 否
314  */
315 ACL_API int acl_aio_get_keep_read(ACL_AIO *aio);
316 
317 /**
318  * 设置异步IO框架的持续读模式
319  * @param aio {ACL_AIO*} 异步框架引擎句柄
320  * @param onoff {int} 0: 关闭持续读功能; != 0: 打开持续读功能
321  */
322 ACL_API void acl_aio_set_keep_read(ACL_AIO *aio, int onoff);
323 
324 /**
325  * 获得当前异步引擎循环时的等待时间的秒部分
326  * @param aio {ACL_AIO*} 异步框架引擎句柄
327  * @return {int} 用 select/poll/epoll/kqueue/devpoll 时的秒级等待时间
328  */
329 ACL_API int acl_aio_get_delay_sec(ACL_AIO *aio);
330 
331 /**
332  * 获得当前异步引擎循环时的等待时间的微秒部分
333  * @param aio {ACL_AIO*} 异步框架引擎句柄
334  * @return {int} 用 select/poll/epoll/kqueue/devpoll 时的微秒级等待时间
335  */
336 ACL_API int acl_aio_get_delay_usec(ACL_AIO *aio);
337 
338 /**
339  * 设置异步引擎循环的等待时间中的秒级部分
340  * @param aio {ACL_AIO*} 异步框架引擎句柄
341  * @param delay_sec {int} 设置用 select/poll/epoll/kqueue/devpoll
342  * 时的秒级等待时间
343  */
344 ACL_API void acl_aio_set_delay_sec(ACL_AIO *aio, int delay_sec);
345 
346 /**
347  * 设置异步引擎循环的等待时间中的微秒级部分
348  * @param aio {ACL_AIO*} 异步框架引擎句柄
349  * @param delay_usec {int} 设置用 select/poll/epoll/kqueue/devpoll
350  * 时的微秒级等待时间
351  */
352 ACL_API void acl_aio_set_delay_usec(ACL_AIO *aio, int delay_usec);
353 
354 /**
355  * 设置事件循环过程中定时检查所有描述字状态的时间间隔,内部缺省值为 100 ms
356  * @param aio {ACL_AIO*} 异步框架引擎句柄
357  * @param check_inter {int} 定时查检时间间隔 (毫秒级)
358  */
359 ACL_API void acl_aio_set_check_inter(ACL_AIO *aio, int check_inter);
360 
361 /**
362  * 设置异步流的读缓存区大小
363  * @param aio {ACL_AIO*} 异步框架引擎句柄
364  * @param rbuf_size {int} 读缓冲区大小
365  */
366 ACL_API void acl_aio_set_rbuf_size(ACL_AIO *aio, int rbuf_size);
367 
368 /**
369  * 设置监听异步流每次接收客户端连接时循环接收个数
370  * @param astream {ACL_ASTREAM*} 监听流
371  * @param nloop {int}
372  */
373 ACL_API void acl_aio_set_accept_nloop(ACL_ASTREAM *astream, int nloop);
374 
375 /**
376  * 从异步流中获得异步框架引擎句柄
377  * @param stream {ACL_ASTREAM*} 异步IO流
378  * @return {ACL_AIO*} 异步框架引擎句柄
379  */
380 ACL_API ACL_AIO *acl_aio_handle(ACL_ASTREAM *stream);
381 
382 /**
383  * 设置异步流的参数
384  * @param stream {ACL_ASTREAM*} 异步IO流
385  * @param ctx {void*} 参数
386  */
387 ACL_API void acl_aio_set_ctx(ACL_ASTREAM *stream, void *ctx);
388 
389 /**
390  * 获得异步流的参数
391  * @param stream {ACL_ASTREAM*} 异步IO流
392  * @return {void*} 异步流 stream 的参数
393  */
394 ACL_API void *acl_aio_get_ctx(ACL_ASTREAM *stream);
395 
396 /**
397  * 打开一个异步通信流的句柄
398  * @param aio {ACL_AIO*} 异步框架引擎句柄
399  * @param stream {ACL_VSTREAM*} 受监控的流, 当该流有完整的一行数据、出错
400  * 或读超时时将回调用户的注册函数.
401  * @return {ACL_ASTREAM*} 异步通信流句柄
402  */
403 ACL_API ACL_ASTREAM *acl_aio_open(ACL_AIO *aio, ACL_VSTREAM *stream);
404 
405 /**
406  * 异步IO完成后关闭流,否则进行异步关闭动作,即需要等读写都完成时才关闭流
407  * @param astream {ACL_ASTREAM*} 异步数据流
408  */
409 ACL_API void acl_aio_iocp_close(ACL_ASTREAM *astream);
410 
411 /**
412  * 取消异步IO过程,该功能主要是为了将异步IO流转换为同步IO流而写
413  * @param astream {ACL_ASTREAM*} 异步IO流
414  * @return {ACL_VSTREAM*} 流句柄
415  */
416 ACL_API ACL_VSTREAM *acl_aio_cancel(ACL_ASTREAM *astream);
417 
418 /**
419  * 获得监听描述符每次接收客户端连接的最大个数
420  * @param astream {ACL_ASTREAM *} 监听描述符流
421  * @return {int} 每次接收连接的最大个数
422  * @return {int} 监听描述符在每次接收过程中可以循环接收的最大连接
423  * 个数,此值最小为1
424  */
425 ACL_API int acl_aio_get_accept_max(ACL_ASTREAM *astream);
426 
427 /**
428  * 设置监听描述符每次接收客户端连接的最大个数
429  * @param astream {ACL_ASTREAM *} 监听描述符流
430  * @param accept_max {int} 监听描述符在每次接收过程中可以循环接收的最大连接
431  * 个数,此值最小为1
432  */
433 ACL_API void acl_aio_set_accept_max(ACL_ASTREAM *astream, int accept_max);
434 
435 /**
436  * 添加附加读回调函数
437  * @param astream {ACL_ASTREAM*} 异步流,不能为空
438  * @param callback {ACL_AIO_READ_FN} 回调函数,不能为空
439  * @param ctx {void*} callback 回调函数的回调参数,可以为空
440  */
441 ACL_API void acl_aio_add_read_hook(ACL_ASTREAM *astream,
442  ACL_AIO_READ_FN callback, void *ctx);
443 
444 /**
445  * 添加附加写回调函数
446  * @param astream {ACL_ASTREAM*} 异步流,不能为空
447  * @param callback {ACL_AIO_READ_FN} 回调函数,不能为空
448  * @param ctx {void*} callback 回调函数的回调参数,可以为空
449  */
450 ACL_API void acl_aio_add_write_hook(ACL_ASTREAM *astream,
451  ACL_AIO_WRITE_FN callback, void *ctx);
452 
453 /**
454  * 添加附加关闭回调函数
455  * @param astream {ACL_ASTREAM*} 异步流,不能为空
456  * @param callback {ACL_AIO_READ_FN} 回调函数,不能为空
457  * @param ctx {void*} callback 回调函数的回调参数,可以为空
458  */
459 ACL_API void acl_aio_add_close_hook(ACL_ASTREAM *astream,
460  ACL_AIO_CLOSE_FN callback, void *ctx);
461 
462 /**
463  * 添加附加超时回调函数
464  * @param astream {ACL_ASTREAM*} 异步流,不能为空
465  * @param callback {ACL_AIO_READ_FN} 回调函数,不能为空
466  * @param ctx {void*} callback 回调函数的回调参数,可以为空
467  */
468 ACL_API void acl_aio_add_timeo_hook(ACL_ASTREAM *astream,
469  ACL_AIO_TIMEO_FN callback, void *ctx);
470 
471 /**
472  * 添加附加连接成功回调函数
473  * @param astream {ACL_ASTREAM*} 异步流,不能为空
474  * @param callback {ACL_AIO_READ_FN} 回调函数,不能为空
475  * @param ctx {void*} callback 回调函数的回调参数,可以为空
476  */
477 ACL_API void acl_aio_add_connect_hook(ACL_ASTREAM *astream,
478  ACL_AIO_CONNECT_FN callback, void *ctx);
479 
480 /**
481  * 删除附加读回调函数
482  * @param astream {ACL_ASTREAM*} 异步流,不能为空
483  * @param callback {ACL_AIO_READ_FN} 回调函数,不能为空
484  * @param ctx {void*} callback 回调函数的回调参数,可以为空
485  */
486 ACL_API void acl_aio_del_read_hook(ACL_ASTREAM *astream,
487  ACL_AIO_READ_FN callback, void *ctx);
488 
489 /**
490  * 删除附加写回调函数
491  * @param astream {ACL_ASTREAM*} 异步流,不能为空
492  * @param callback {ACL_AIO_READ_FN} 回调函数,不能为空
493  * @param ctx {void*} callback 回调函数的回调参数,可以为空
494  */
495 ACL_API void acl_aio_del_write_hook(ACL_ASTREAM *astream,
496  ACL_AIO_WRITE_FN callback, void *ctx);
497 
498 /**
499  * 删除附加关闭回调函数
500  * @param astream {ACL_ASTREAM*} 异步流,不能为空
501  * @param callback {ACL_AIO_READ_FN} 回调函数,不能为空
502  * @param ctx {void*} callback 回调函数的回调参数,可以为空
503  */
504 ACL_API void acl_aio_del_close_hook(ACL_ASTREAM *astream,
505  ACL_AIO_CLOSE_FN callback, void *ctx);
506 
507 /**
508  * 删除附加超时回调函数
509  * @param astream {ACL_ASTREAM*} 异步流,不能为空
510  * @param callback {ACL_AIO_READ_FN} 回调函数,不能为空
511  * @param ctx {void*} callback 回调函数的回调参数,可以为空
512  */
513 ACL_API void acl_aio_del_timeo_hook(ACL_ASTREAM *astream,
514  ACL_AIO_TIMEO_FN callback, void *ctx);
515 
516 /**
517  * 删除附加连接成功回调函数
518  * @param astream {ACL_ASTREAM*} 异步流,不能为空
519  * @param callback {ACL_AIO_READ_FN} 回调函数,不能为空
520  * @param ctx {void*} callback 回调函数的回调参数,可以为空
521  */
522 ACL_API void acl_aio_del_connect_hook(ACL_ASTREAM *astream,
523  ACL_AIO_CONNECT_FN callback, void *ctx);
524 
525 /**
526  * 清除所有的附加读回调函数
527  * @param astream {ACL_ASTREAM*} 异步流,不能为空
528  */
529 ACL_API void acl_aio_clean_read_hooks(ACL_ASTREAM *astream);
530 
531 /**
532  * 清除所有的附加写回调函数
533  * @param astream {ACL_ASTREAM*} 异步流,不能为空
534  */
535 ACL_API void acl_aio_clean_write_hooks(ACL_ASTREAM *astream);
536 
537 /**
538  * 清除所有的附加关闭回调函数
539  * @param astream {ACL_ASTREAM*} 异步流,不能为空
540  */
541 ACL_API void acl_aio_clean_close_hooks(ACL_ASTREAM *astream);
542 
543 /**
544  * 清除所有的附加超时回调函数
545  * @param astream {ACL_ASTREAM*} 异步流,不能为空
546  */
547 ACL_API void acl_aio_clean_timeo_hooks(ACL_ASTREAM *astream);
548 
549 /**
550 * 清除所有的附加连接成功回调函数
551 * @param astream {ACL_ASTREAM*} 异步流,不能为空
552 */
553 ACL_API void acl_aio_clean_connect_hooks(ACL_ASTREAM *astream);
554 
555 /**
556  * 清除所有的附加回调函数
557  * @param astream {ACL_ASTREAM*} 异步流,不能为空
558  */
559 ACL_API void acl_aio_clean_hooks(ACL_ASTREAM *astream);
560 
561 /**
562  * 设置异步流的属性
563  * @param astream {ACL_ASTREAM*} 异步流对象
564  * @param name {int} 第一个控制参数
565  * @param ... 变参列表,格式为:ACL_AIO_CTL_XXX, xxx, 最后一个控制参数
566  * 为 ACL_AIO_CTL_END
567  */
568 ACL_API void acl_aio_ctl(ACL_ASTREAM *astream, int name, ...);
569 #define ACL_AIO_CTL_END 0 /**< 控制结束标志 */
570 #define ACL_AIO_CTL_ACCEPT_FN 1 /**< 设置接收连接后回调函数 */
571 #define ACL_AIO_CTL_LISTEN_FN 2 /**< 设置有连接到达时回调函数 */
572 #define ACL_AIO_CTL_CTX 3 /**< 设置应用的参数 */
573 #define ACL_AIO_CTL_TIMEOUT 4 /**< 设置超时时间 */
574 #define ACL_AIO_CTL_LINE_LENGTH 5 /**< 设置所读行数据的最大长长度 */
575 #define ACL_AIO_CTL_STREAM 10 /**< 设置ACL_VSTREAM流指针 */
576 #define ACL_AIO_CTL_READ_NESTED 11 /**< 设置最大读嵌套层数 */
577 #define ACL_AIO_CTL_WRITE_NESTED 12 /**< 设置最大写嵌套层数 */
578 #define ACL_AIO_CTL_KEEP_READ 13 /**< 设置是否连续读标志 */
579 #define ACL_AIO_CTL_READ_HOOK_ADD 14 /**< 添加附加读回调函数 */
580 #define ACL_AIO_CTL_READ_HOOK_DEL 15 /**< 删除附加读回调函数 */
581 #define ACL_AIO_CTL_WRITE_HOOK_ADD 16 /**< 添加附加写回调函数 */
582 #define ACL_AIO_CTL_WRITE_HOOK_DEL 17 /**< 删除附加写回调函数 */
583 #define ACL_AIO_CTL_CLOSE_HOOK_ADD 18 /**< 添加附加关闭回调函数 */
584 #define ACL_AIO_CTL_CLOSE_HOOK_DEL 19 /**< 删除附加关闭回调函数 */
585 #define ACL_AIO_CTL_TIMEO_HOOK_ADD 20 /**< 添加附加超时回调函数 */
586 #define ACL_AIO_CTL_TIMEO_HOOK_DEL 21 /**< 删除附加超时回调函数 */
587 #define ACL_AIO_CTL_CONNECT_HOOK_ADD 22 /**< 添加附加连接回调函数 */
588 #define ACL_AIO_CTL_CONNECT_HOOK_DEL 23 /**< 删除附加连接回调函数 */
589 
590 /**
591  * 从异步流中提取 ACL_VSTREAM 流
592  * @param astream {ACL_ASTREAM*} 异步IO流
593  * @return {ACL_VSTREAM*} 通信流指针
594  */
595 ACL_API ACL_VSTREAM *acl_aio_vstream(ACL_ASTREAM *astream);
596 
597 /*---------------------------- 异步读操作接口 --------------------------------*/
598 
599 /**
600  * 异步从流中读取一行数据, 当成功读取一行数据、出错、读超时时将回调用户的
601  * 注册函数: notify_fn
602  * @param astream {ACL_ASTREAM*} 受监控的流, 当该流有完整的一行数据、出错
603  * 或读超时时将回调用户的注册函数.
604  * 注: 读操作发生在异步框架内.
605  * 当通过 acl_aio_stream_set_line_length 设置了行最大长度限制,则当接收的
606  * 数据行过大时,为避免缓冲区溢出,该函数的处理过程将会在缓冲区达到该长度
607  * 限制时被触发,直接将数据交由使用者注册的回调过程
608  */
609 ACL_API void acl_aio_gets(ACL_ASTREAM *astream);
610 
611 /**
612  * 异步从流中读取一行数据, 当成功读取一行数据、出错、读超时时将回调用户的
613  * 注册函数: notify_fn, 与 acl_aio_gets 功能类似, 但唯一的区别是返回的数据
614  * data 中不包含 "\r\n" 或 "\n", 当读到一个空行时, 则 dlen == 0.
615  * @param astream {ACL_ASTREAM*} 受监控的流, 当该流有完整的一行数据、出错
616  * 或读超时时将回调用户的注册函数.
617  * 注: 读操作发生在异步框架内.
618  * 数据行过大时,为避免缓冲区溢出,该函数的处理过程将会在缓冲区达到该长度
619  * 限制时被触发,直接将数据交由使用者注册的回调过程
620  */
621 ACL_API void acl_aio_gets_nonl(ACL_ASTREAM *astream);
622 
623 /**
624  * 异步从流中读取数据, 读取的数据格式及长度没有特殊要求.
625  * @param astream {ACL_ASTREAM*} 处于读监控的流. 当该流出错、超时或已经读取了一定
626  * 长度的数据时将触发事件通知过程
627  * 注: 读操作发生在异步框架内.
628  */
629 ACL_API void acl_aio_read(ACL_ASTREAM *astream);
630 
631 /**
632  * 异步从流中读取要求长度的数据, 当流出错、超时或读到了所要求的数据长度时将
633  * 触发事件通知过程
634  * @param astream {ACL_ASTREAM*} 处于读监控的流. 当该流出错、超时或已经读取了所
635  * 要求长度的数据时将触发事件通知过程
636  * @param count {int} 所要求的数据的长度, 必须大于 0.
637  * 注: 读操作发生在异步框架内.
638  */
639 ACL_API void acl_aio_readn(ACL_ASTREAM *astream, int count);
640 
641 /**
642  * 尝试性读取一行数据
643  * @param astream {ACL_ASTREM*} 异步流对象
644  * @return {ACL_VSTRING*} 若读得完整一行则返回非空对象,用户用完此 ACL_VSTRING
645  * 数据后应调用 ACL_VSTRING_RESET(s) 清空缓冲区; 若未读得完整行则返回空
646  */
647 ACL_API ACL_VSTRING *acl_aio_gets_peek(ACL_ASTREAM *astream);
648 
649 /**
650  * 尝试性读取一行数据(不包含 \n 或 \r\n)
651  * @param astream {ACL_ASTREM*} 异步流对象
652  * @return {ACL_VSTRING*} 若读得完整一行则返回非空对象,用户用完此 ACL_VSTRING
653  * 数据后应调用 ACL_VSTRING_RESET(s) 清空缓冲区, 另外如果读到一个空行,则返回的
654  * ACL_VSTRING 的缓冲区的数据长度(ACL_VSTRING_LEN 获得此值) 应为 0;
655  * 若未读得完整行则返回空
656  */
658 
659 /**
660  * 尝试性从异步流中读取数据,如果有数据则返回没有则返回空
661  * @param astream {ACL_ASTREM*} 异步流对象
662  * @param count {int*} 函数返回后将存放本次读到的数据长度,返回值永远 >= 0
663  * @return {ACL_VSTRING*} 若读到了数据则返回的缓冲区非空(使用者用完此缓冲区后
664  * 需要调用 ACL_VSTRING_RESET(s) 清空此缓冲区), 否则返回空
665  */
666 ACL_API ACL_VSTRING *acl_aio_read_peek(ACL_ASTREAM *astream, int *count);
667 
668 /**
669  * 尝试性从异步流中读给定长度的数据,如果读到的数据满足要求则返回缓冲区
670  * @param astream {ACL_ASTREM*} 异步流对象
671  * @param count {int*} 要求读到的数据长度,函数返回后将存放本次读到的字节数,
672  * 存放的值永远 >= 0
673  * @return {ACL_VSTRING*} 若读到规定长度则返回非空缓冲区(使用者用完此缓冲区后
674  * 需要调用 ACL_VSTRING_RESET(s) 清空此缓冲区), 否则返回空
675  */
676 ACL_API ACL_VSTRING *acl_aio_readn_peek(ACL_ASTREAM *astream, int *count);
677 
678 /**
679  * 设置异步流为读监听状态,当该流可读时则调用用户的回调函数
680  * @param astream {ACL_ASTREM*} 异步流对象
681  * @param can_read_fn {ACL_AIO_NOTIFY_FN} 用户回调函数
682  * @param context {void*} can_read_fn 的参数之一
683  */
684 ACL_API void acl_aio_enable_read(ACL_ASTREAM *astream,
685  ACL_AIO_NOTIFY_FN can_read_fn, void *context);
686 
687 /**
688  * 检测异步流有多少数据可读
689  * @param astream {ACL_ASTREM*} 异步流对象
690  * @return {int} ACL_VSTREAM_EOF 表示出错,应该关闭该流; 0 表示无数据可读;
691  * > 0 表示有数据可读
692  */
693 ACL_API int acl_aio_can_read(ACL_ASTREAM *astream);
694 
695 /**
696  * 停止对一个数据流进行IO读操作
697  * @param astream {ACL_ASTREAM*} 异步数据流
698  */
699 ACL_API void acl_aio_disable_read(ACL_ASTREAM *astream);
700 
701 /**
702  * 判断流是否在异步事件的读监听集合中
703  * @param astream {ACL_ASTREAM*} 异步数据流
704  * @return {int} 0: 否,!= 0: 是
705  */
706 ACL_API int acl_aio_isrset(ACL_ASTREAM *astream);
707 
708 /**
709  * 设置读一行数据时每行数据的最大长度限制,这样的目的主要是为了防止对方发送的
710  * 一行数据过长,造成本地接收缓冲区内存溢出
711  * @param astream {ACL_ASTREAM*} 异步数据流
712  * @param len {int} 当该值 > 0 时将会限制按行读的数据长度
713  */
714 ACL_API void acl_aio_stream_set_line_length(ACL_ASTREAM *astream, int len);
715 
716 /**
717  * 获得所设置的流按行读数据时的最大长度限制
718  * @param astream {ACL_ASTREAM*} 异步数据流
719  * @return {int}
720  */
721 ACL_API int acl_aio_stream_get_line_length(ACL_ASTREAM *astream);
722 
723 /**
724  * 单独设置异步流的连续读标记,缺省情况下自动继承 ACL_AIO 中的 keep_read
725  * 标记(其默认情况下是连续读)
726  * @param astream {ACL_ASTREAM*} 异步数据流
727  * @param onoff {int} 0 表示关闭连续读功能,非0表示打开连续读功能
728  */
729 ACL_API void acl_aio_stream_set_keep_read(ACL_ASTREAM *astream, int onoff);
730 
731 /**
732  * 获得异步流是否是设置了连续读标记
733  * @return {int} 0 表示关闭了连续读功能,非0表示打开了连续读功能
734  */
735 ACL_API int acl_aio_stream_get_keep_read(ACL_ASTREAM *astream);
736 
737 /*---------------------------- 异步写操作接口 --------------------------------*/
738 
739 /**
740  * 异步向流中写数据, 当流出错、写超时或写成功时将触发事件通知过程
741  * @param astream {ACL_ASTREAM*} 处于写监控的流.
742  * @param data {const char*} 所写数据的内存开始指针位置
743  * @param dlen {int} data 中数据长度
744  */
745 ACL_API void acl_aio_writen(ACL_ASTREAM *astream, const char *data, int dlen);
746 
747 /**
748  * 异步向流中写数据, 当流出错、写超时或写成功时将触发事件通知过程,类似系统的
749  * writev
750  * @param astream {ACL_ASTREAM*} 处于写监控的流.
751  * @param vector {const struct iovec*} 数据集合数组
752  * @param count {int} vector 数组的长度
753  */
754 ACL_API void acl_aio_writev(ACL_ASTREAM *astream,
755  const struct iovec *vector, int count);
756 
757 /**
758  * 以格式方式异步向流中写数据, 当流出错、写超时或写成功时将触发事件通知过程
759  * @param astream {ACL_ASTREAM*} 处于写监控的流
760  * @param fmt {const char*} 格式字符串
761  * @param ap {va_list} 格式字符串的参数列表
762  */
763 ACL_API void acl_aio_vfprintf(ACL_ASTREAM *astream, const char *fmt, va_list ap);
764 
765 /**
766  * 以格式方式异步向流中写数据, 当流出错、写超时或写成功时将触发事件通知过程
767  * @param astream {ACL_ASTREAM*} 处于写监控的流
768  * @param fmt {const char*} 格式字符串
769  * @param ... 变参参数表
770  */
771 ACL_API void ACL_PRINTF(2, 3) acl_aio_fprintf(ACL_ASTREAM *astream, const char *fmt, ...);
772 
773 /**
774  * 设置异步流为写监听状态,当该流可写时则调用用户的回调函数
775  * @param astream {ACL_ASTREM*} 异步流对象
776  * @param can_write_fn {ACL_AIO_NOTIFY_FN} 用户回调函数
777  * @param context {void*} can_write_fn 的参数之一
778  */
779 ACL_API void acl_aio_enable_write(ACL_ASTREAM *astream,
780  ACL_AIO_NOTIFY_FN can_write_fn, void *context);
781 
782 /**
783  * 停止对一个数据流进行IO写操作
784  * @param astream {ACL_ASTREAM*} 异步数据流
785  */
786 ACL_API void acl_aio_disable_write(ACL_ASTREAM *astream);
787 
788 /**
789  * 判断流是否在异步事件的写监听集合中
790  * @param astream {ACL_ASTREAM*} 异步数据流
791  * @return {int} 0: 否,!= 0: 是
792  */
793 ACL_API int acl_aio_iswset(ACL_ASTREAM *astream);
794 
795 /*---------------------------- 异步监听操作接口 ------------------------------*/
796 
797 /**
798  * 异步接收一个客户端连接流, 并将该客户端流回传给用户
799  * @param astream {ACL_ASTREAM*} 处于监听状态的流
800  */
801 ACL_API void acl_aio_accept(ACL_ASTREAM *astream);
802 
803 /**
804  * 异步监听, 当监听流上出错、超时或有新连接到达时将触发监听事件通知过程, 当有
805  * 新连接时用户需在自己的注册函数里 accept() 该新连接.
806  * @param astream {ACL_ASTREAM*} 处于监听状态的流
807  */
808 ACL_API void acl_aio_listen(ACL_ASTREAM *astream);
809 
810 /*---------------------------- 异步连接操作接口 ------------------------------*/
811 
812 /**
813  * 异步连接一个远程服务器, 当连接流出错、超时或连接成功时将触发事件通知过程.
814  * @param aio {ACL_AIO*} 异步框架引擎句柄
815  * @param addr {const char*} 远程服务器地址, 格式: ip:port, 如: 192.168.0.1:80
816  * @param timeout {int} 连接超时的时间值,单位为秒
817  * @return {ACL_ASTREAM*} 创建异步连接过程是否成功
818  */
819 ACL_API ACL_ASTREAM *acl_aio_connect(ACL_AIO *aio, const char *addr, int timeout);
820 
821 /**
822  * 异步连接一个远程服务器,给定的地址可以是域名,以区别于 acl_aio_connect 函数,
823  * 使用本函数的首要条件是必须通过 acl_aio_set_dns 设置的域名服务器的地址
824  * @param aio {ACL_AIO*} 异步框架引擎句柄
825  * @param addr {const char*} 服务器地址,格式:domain:port,如:www.sina.com:80
826  * @param timeout {int} 连接超时的时间值,单位为秒
827  * @param callback {ACL_AIO_CONNECT_ADDR_FN}
828  * @param context {void*} 传递给 callback 回调函数的参数
829  * @return {int} 返回 0 表示开始异步域名解析及异步连接过程,返回 < 0 表示传入的
830  * 参数有误或在创建 ACL_AIO 句柄后没有通过 acl_aio_set_dns 函数设置域名服务器
831  */
832 ACL_API int acl_aio_connect_addr(ACL_AIO *aio, const char *addr, int timeout,
833  ACL_AIO_CONNECT_ADDR_FN callback, void *context);
834 
835 /*---------------------------- 其它通用异步操作接口 --------------------------*/
836 
837 /**
838  * 停止对一个数据流进行IO读写操作
839  * @param astream {ACL_ASTREAM*} 异步数据流
840  */
841 ACL_API void acl_aio_disable_readwrite(ACL_ASTREAM *astream);
842 
843 /**
844  * 判断流是否在异步事件的读或写监听集合中
845  * @param astream {ACL_ASTREAM*} 异步数据流
846  * @return {int} 0: 否,!= 0: 是
847  */
848 ACL_API int acl_aio_isset(ACL_ASTREAM *astream);
849 
850 /**
851  * 获得当前异步流的引用计数值
852  * @param astream {ACL_ASTREAM*} 异步数据流
853  * @return {int} >=0,异步流的引用计数值
854  */
855 ACL_API int acl_aio_refer_value(ACL_ASTREAM * astream);
856 
857 /**
858  * 将异步流的引用计数值加1
859  * @param astream {ACL_ASTREAM*} 异步数据流
860  */
861 ACL_API void acl_aio_refer(ACL_ASTREAM *astream);
862 
863 /**
864  * 将异步流的引用计数值减1
865  * @param astream {ACL_ASTREAM*} 异步数据流
866  */
867 ACL_API void acl_aio_unrefer(ACL_ASTREAM *astream);
868 
869 /**
870  * 添加一个定时器任务, 该函数仅是 acl_event_request_timer 的简单封装
871  * @param aio {ACL_AIO*} 异步通信引擎句柄
872  * @param timer_fn {ACL_EVENT_NOTIFY_TIME} 定时器任务回调函数.
873  * @param context {void*} timer_fn 的参数之一.
874  * @param idle_limit {acl_int64} 启动定时器函数的时间,单位为微秒.
875  * @param keep {int} 是否重复定时器任务
876  * @return {acl_int64} 剩余的时间, 单位为微秒.
877  */
878 ACL_API acl_int64 acl_aio_request_timer(ACL_AIO *aio,
879  ACL_EVENT_NOTIFY_TIME timer_fn, void *context,
880  acl_int64 idle_limit, int keep);
881 
882 /**
883  * 取消某个定时器任务, 该函数仅是 acl_event_cancel_timer 的简单封装.
884  * @param aio {ACL_AIO*} 异步通信引擎句柄
885  * @param timer_fn {ACL_EVENT_NOTIFY_TIME} 定时器任务回调函数.
886  * @param context {void*} timer_fn 的参数之一.
887  * @return {acl_int64} 剩余的时间, 单位为微秒.
888  */
889 ACL_API acl_int64 acl_aio_cancel_timer(ACL_AIO *aio,
890  ACL_EVENT_NOTIFY_TIME timer_fn, void *context);
891 
892 /**
893  * 设置是否需要循环启用通过 acl_aio_request_timer 设置的定时器任务
894  * @param aio {ACL_AIO*} 异步通信引擎句柄
895  * @param timer_fn {ACL_EVENT_NOTIFY_TIME} 定时器任务回调函数.
896  * @param context {void*} timer_fn 的参数之一.
897  * @param onoff {int} 是否重复定时器任务
898  */
899 ACL_API void acl_aio_keep_timer(ACL_AIO *aio, ACL_EVENT_NOTIFY_TIME timer_fn,
900  void *context, int onoff);
901 
902 /**
903  * 判断所设置的定时器都处于重复使用状态
904  * @param aio {ACL_AIO*} 异步通信引擎句柄
905  * @param timer_fn {ACL_EVENT_NOTIFY_TIME} 定时器任务回调函数.
906  * @param context {void*} timer_fn 的参数之一.
907  * @return {int} !0 表示所设置的定时器都处于重复使用状态
908  */
909 ACL_API int acl_aio_timer_ifkeep(ACL_AIO *aio, ACL_EVENT_NOTIFY_TIME timer_fn,
910  void *context);
911 
912 #ifdef __cplusplus
913 }
914 #endif
915 
916 #endif
ACL_API int acl_aio_isset(ACL_ASTREAM *astream)
int(* ACL_AIO_CONNECT_ADDR_FN)(const ACL_ASTREAM_CTX *ctx)
Definition: acl_aio.h:117
ACL_API int acl_aio_can_read(ACL_ASTREAM *astream)
ACL_API void * acl_astream_get_ctx(const ACL_ASTREAM_CTX *ctx)
ACL_API void acl_aio_del_write_hook(ACL_ASTREAM *astream, ACL_AIO_WRITE_FN callback, void *ctx)
int error
Definition: acl_aio.h:164
int read_nested
Definition: acl_aio.h:159
ACL_API void * acl_aio_get_ctx(ACL_ASTREAM *stream)
ACL_API void acl_aio_set_accept_nloop(ACL_ASTREAM *astream, int nloop)
HTTP_API void const char * name
Definition: lib_http.h:620
int flag
Definition: acl_aio.h:145
ACL_ARRAY * close_handles
Definition: acl_aio.h:178
ACL_API void acl_aio_clean_read_hooks(ACL_ASTREAM *astream)
ACL_API void ACL_PRINTF(2, 3) acl_aio_fprintf(ACL_ASTREAM *astream
int(* read_ready_fn)(ACL_VSTREAM *, ACL_VSTRING *, int *)
Definition: acl_aio.h:158
ACL_API ACL_VSTRING * acl_aio_readn_peek(ACL_ASTREAM *astream, int *count)
ACL_API void acl_aio_ctl(ACL_ASTREAM *astream, int name,...)
int(* ACL_AIO_ACCEPT_FN)(ACL_ASTREAM *cstream, void *context)
Definition: acl_aio.h:77
ACL_API void acl_aio_free(ACL_AIO *aio)
ACL_API void * acl_aio_dns(ACL_AIO *aio)
ACL_API ACL_EVENT * acl_aio_event(ACL_AIO *aio)
ACL_API void acl_aio_clean_close_hooks(ACL_ASTREAM *astream)
ACL_ARRAY * connect_handles
Definition: acl_aio.h:180
ACL_API void acl_aio_writev(ACL_ASTREAM *astream, const struct iovec *vector, int count)
ACL_API int acl_aio_last_nready(ACL_AIO *aio)
ACL_API void acl_aio_enable_read(ACL_ASTREAM *astream, ACL_AIO_NOTIFY_FN can_read_fn, void *context)
ACL_AIO_NOTIFY_FN can_read_fn
Definition: acl_aio.h:171
int write_nested_limit
Definition: acl_aio.h:156
ACL_API int acl_aio_refer_value(ACL_ASTREAM *astream)
ACL_API void acl_aio_free2(ACL_AIO *aio, int keep)
ACL_API void acl_aio_add_write_hook(ACL_ASTREAM *astream, ACL_AIO_WRITE_FN callback, void *ctx)
ACL_API void acl_aio_listen(ACL_ASTREAM *astream)
ACL_API int acl_aio_timer_ifkeep(ACL_AIO *aio, ACL_EVENT_NOTIFY_TIME timer_fn, void *context)
ACL_API ACL_VSTRING * acl_aio_gets_peek(ACL_ASTREAM *astream)
ACL_API int acl_astream_get_status(const ACL_ASTREAM_CTX *ctx)
ACL_API int acl_aio_get_keep_read(ACL_AIO *aio)
ACL_API void acl_aio_add_read_hook(ACL_ASTREAM *astream, ACL_AIO_READ_FN callback, void *ctx)
ACL_API ACL_VSTREAM * acl_aio_cancel(ACL_ASTREAM *astream)
int(* ACL_AIO_CONNECT_FN)(ACL_ASTREAM *cstream, void *context)
Definition: acl_aio.h:96
ACL_ARRAY * read_handles
Definition: acl_aio.h:176
int write_nested
Definition: acl_aio.h:155
ACL_API void acl_aio_writen(ACL_ASTREAM *astream, const char *data, int dlen)
ACL_API void acl_aio_clean_timeo_hooks(ACL_ASTREAM *astream)
int write_offset
Definition: acl_aio.h:154
ACL_API int acl_aio_get_accept_max(ACL_ASTREAM *astream)
ACL_API void acl_aio_stream_set_line_length(ACL_ASTREAM *astream, int len)
ACL_AIO_ACCEPT_FN accept_fn
Definition: acl_aio.h:167
ACL_API void const char ACL_API void acl_aio_enable_write(ACL_ASTREAM *astream, ACL_AIO_NOTIFY_FN can_write_fn, void *context)
ACL_FIFO writer_fifo
Definition: acl_aio.h:182
int line_length
Definition: acl_aio.h:165
ACL_API acl_int64 acl_aio_request_timer(ACL_AIO *aio, ACL_EVENT_NOTIFY_TIME timer_fn, void *context, acl_int64 idle_limit, int keep)
ACL_FIFO reader_fifo
Definition: acl_aio.h:181
int(* ACL_AIO_WRITE_FN)(ACL_ASTREAM *astream, void *context)
Definition: acl_aio.h:67
ACL_API int acl_aio_connect_addr(ACL_AIO *aio, const char *addr, int timeout, ACL_AIO_CONNECT_ADDR_FN callback, void *context)
ACL_API void acl_aio_disable_read(ACL_ASTREAM *astream)
int read_nested_limit
Definition: acl_aio.h:160
ACL_API void acl_aio_unrefer(ACL_ASTREAM *astream)
ACL_API void acl_aio_loop(ACL_AIO *aio)
ACL_API void acl_aio_set_ctx(ACL_ASTREAM *stream, void *ctx)
ACL_VSTREAM * stream
Definition: acl_aio.h:140
ACL_API void acl_aio_set_accept_max(ACL_ASTREAM *astream, int accept_max)
ACL_API void acl_aio_clean_connect_hooks(ACL_ASTREAM *astream)
ACL_API void acl_aio_set_keep_read(ACL_AIO *aio, int onoff)
ACL_API void acl_aio_clean_hooks(ACL_ASTREAM *astream)
ACL_API void acl_aio_set_rbuf_size(ACL_AIO *aio, int rbuf_size)
void(* event_read_callback)(int event_type, ACL_ASTREAM *astream)
Definition: acl_aio.h:185
int nrefer
Definition: acl_aio.h:144
ACL_VSTRING strbuf
Definition: acl_aio.h:142
ACL_API ACL_VSTRING * acl_aio_read_peek(ACL_ASTREAM *astream, int *count)
ACL_API void acl_aio_del_read_hook(ACL_ASTREAM *astream, ACL_AIO_READ_FN callback, void *ctx)
int(* ACL_AIO_READ_FN)(ACL_ASTREAM *astream, void *context, char *data, int dlen)
Definition: acl_aio.h:48
ACL_API ACL_AIO * acl_aio_handle(ACL_ASTREAM *stream)
void * context
Definition: acl_aio.h:169
ACL_API const ACL_SOCKADDR * acl_astream_get_ns_addr(const ACL_ASTREAM_CTX *ctx)
void * can_read_ctx
Definition: acl_aio.h:172
ACL_API ACL_ASTREAM * acl_aio_open(ACL_AIO *aio, ACL_VSTREAM *stream)
struct ACL_AIO ACL_AIO
Definition: acl_aio.h:31
ACL_API void acl_aio_set_check_inter(ACL_AIO *aio, int check_inter)
ACL_API void acl_aio_add_close_hook(ACL_ASTREAM *astream, ACL_AIO_CLOSE_FN callback, void *ctx)
ACL_API void acl_aio_del_dns(ACL_AIO *aio, const char *dns_list)
ACL_API ACL_AIO * acl_aio_create3(ACL_EVENT *event)
ACL_AIO_NOTIFY_FN can_write_fn
Definition: acl_aio.h:173
int write_left
Definition: acl_aio.h:153
ACL_API void acl_aio_gets_nonl(ACL_ASTREAM *astream)
ACL_API ACL_AIO * acl_aio_create(int event_mode)
ACL_API void acl_aio_iocp_close(ACL_ASTREAM *astream)
int keep_read
Definition: acl_aio.h:162
ACL_API void acl_aio_readn(ACL_ASTREAM *astream, int count)
struct ACL_ASTREAM_CTX ACL_ASTREAM_CTX
Definition: acl_aio.h:98
ACL_API int acl_aio_stream_get_keep_read(ACL_ASTREAM *astream)
ACL_API void acl_aio_stream_set_keep_read(ACL_ASTREAM *astream, int onoff)
ACL_API int acl_aio_isrset(ACL_ASTREAM *astream)
ACL_API void acl_aio_refer(ACL_ASTREAM *astream)
ACL_API void acl_aio_read(ACL_ASTREAM *astream)
ACL_API void acl_aio_check(ACL_AIO *aio)
int(* ACL_AIO_TIMEO_FN)(ACL_ASTREAM *astream, void *context)
Definition: acl_aio.h:126
ACL_ARRAY * write_handles
Definition: acl_aio.h:177
ACL_API void acl_aio_set_delay_sec(ACL_AIO *aio, int delay_sec)
struct ACL_EVENT ACL_EVENT
Definition: acl_events.h:43
int(* ACL_AIO_LISTEN_FN)(ACL_ASTREAM *sstream, void *context)
Definition: acl_aio.h:87
ACL_API int acl_aio_stream_get_line_length(ACL_ASTREAM *astream)
ACL_API int acl_aio_iswset(ACL_ASTREAM *astream)
ACL_API void acl_aio_vfprintf(ACL_ASTREAM *astream, const char *fmt, va_list ap)
int count
Definition: acl_aio.h:161
ACL_API void acl_aio_keep_timer(ACL_AIO *aio, ACL_EVENT_NOTIFY_TIME timer_fn, void *context, int onoff)
ACL_API int acl_aio_event_mode(ACL_AIO *aio)
ACL_API void acl_aio_disable_readwrite(ACL_ASTREAM *astream)
ACL_API void acl_aio_del_timeo_hook(ACL_ASTREAM *astream, ACL_AIO_TIMEO_FN callback, void *ctx)
ACL_API ACL_ASTREAM * acl_astream_get_conn(const ACL_ASTREAM_CTX *ctx)
ACL_API void acl_aio_accept(ACL_ASTREAM *astream)
ACL_API acl_int64 acl_aio_cancel_timer(ACL_AIO *aio, ACL_EVENT_NOTIFY_TIME timer_fn, void *context)
ACL_API void acl_aio_set_delay_usec(ACL_AIO *aio, int delay_usec)
ACL_API ACL_AIO * acl_aio_create2(int event_mode, unsigned int nMsg)
ACL_API void acl_aio_del_connect_hook(ACL_ASTREAM *astream, ACL_AIO_CONNECT_FN callback, void *ctx)
ACL_API void acl_aio_clean_write_hooks(ACL_ASTREAM *astream)
ACL_AIO_LISTEN_FN listen_fn
Definition: acl_aio.h:168
ACL_API void acl_aio_del_close_hook(ACL_ASTREAM *astream, ACL_AIO_CLOSE_FN callback, void *ctx)
void * can_write_ctx
Definition: acl_aio.h:174
ACL_API ACL_VSTRING * acl_aio_gets_nonl_peek(ACL_ASTREAM *astream)
ACL_API void const char * fmt
Definition: acl_aio.h:771
int accept_nloop
Definition: acl_aio.h:163
ACL_API ACL_ASTREAM * acl_aio_connect(ACL_AIO *aio, const char *addr, int timeout)
ACL_API ACL_VSTREAM * acl_aio_vstream(ACL_ASTREAM *astream)
ACL_API int acl_aio_get_delay_usec(ACL_AIO *aio)
ACL_FIFO write_fifo
Definition: acl_aio.h:152
ACL_API void acl_aio_clear_dns(ACL_AIO *aio)
ACL_API const ACL_SOCKADDR * acl_astream_get_serv_addr(const ACL_ASTREAM_CTX *ctx)
ACL_API void acl_aio_disable_write(ACL_ASTREAM *astream)
ACL_AIO * aio
Definition: acl_aio.h:139
ACL_API void acl_aio_add_connect_hook(ACL_ASTREAM *astream, ACL_AIO_CONNECT_FN callback, void *ctx)
ACL_API int acl_aio_get_delay_sec(ACL_AIO *aio)
int(* ACL_AIO_CLOSE_FN)(ACL_ASTREAM *astream, void *context)
Definition: acl_aio.h:134
void(* ACL_EVENT_NOTIFY_TIME)(int event_type, ACL_EVENT *event, void *context)
Definition: acl_events.h:56
ACL_API void acl_aio_gets(ACL_ASTREAM *astream)
ACL_ARRAY * timeo_handles
Definition: acl_aio.h:179
ACL_API void acl_aio_add_timeo_hook(ACL_ASTREAM *astream, ACL_AIO_TIMEO_FN callback, void *ctx)
int timeout
Definition: acl_aio.h:143
ACL_API int acl_aio_set_dns(ACL_AIO *aio, const char *dns_list, int timeout)
int(* ACL_AIO_NOTIFY_FN)(ACL_ASTREAM *astream, void *context)
Definition: acl_aio.h:57