异步IO开发框架, LIB-ZC

LIB-ZC 异步 IO 开发框架, 基于 epoll 实现, 支持 IO事件, IO读写(支持SSL), 定时器

框架特色

框架一般模型

首先说明, 可以创建多个运行环境. 每个运行环境独占用一个线程

第一步 创建运行环境

zaio_base_t * aiobase = zaio_base_create();

第二步 具体业务

举例: 监听端口 fd 是不是可读(比如有connect请求).

先根据 fd 创建一个 IO事件 ev

zaio_t *ev = zaio_create(fd, aiobase);

再设置: 可读的时候执行执行函数 before_accept

void before_accept(zaio_t * ev);
zaio_readable(ev, before_accept); 

zaio_readable 立即返回; 功能: 注册一个可读事件, 在 fd 可读的时候, 循环框架执行 before_accept

第三步 事件循环

zaio_base_run(aiobase, 0);

zaio_base_run 阻塞运行

第四步 释放运行环境

zaio_base_free(aiobase);

异步 IO事件

例子: 创建一个回显服务器, 监听 0:8899 端口

before_accept 的实现

do_echo 的实现

异步 IO读写

创建一个回显服务器, 监听8899端口

参考 "异步 IO事件"

before_accept的实现2

after_read 的实现

after_write 的实现

异步 IO读写, SSL

接上节, 假设 0:8899 是 ssl 端口

before_accept 的实现3

after_ssl_accept 的实现

定时器

参考 "框架一般模型" 部分

foo1 的实现

foo2 的实现

跨线程操作

每次(注意:是每次)执行aio(zaio_t *)的一个回调函数后, 如果希望在其他线程操作这个aio, 则前提是必须先执行

之后就可以可以在其他线程操作了

函数: 基本操作

zaio_t *zaio_create(int fd, zaio_base_t *aiobase);
zaio_t *zaio_create_by_fd(int fd, zaio_base_t *aiobase);

基于 fd 创建异步io

zaio_t *zaio_create_by_ssl(SSL *ssl, zaio_base_t *aiobase);

基于 ssl 创建异步io

void zaio_free(zaio_t *aio, int close_fd_and_release_ssl);

释放; close_fd_and_release_ssl == 1: 同时关闭 fd 或 释放 ssl

void zaio_rebind_aio_base(zaio_t *aio, zaio_base_t *aiobase);

重新绑定 zaio_base_t

int zaio_get_result(zaio_t *aio);

返回 -2: 超时(且没有任何数据), <0: 错, >0: 成功, 或可读的字节数

int zaio_get_fd(zaio_t *aio);

fd

SSL *zaio_get_ssl(zaio_t *aio);

SSL *

void zaio_set_read_wait_timeout(zaio_t *aio, int read_wait_timeout);

设置可读超时

void zaio_set_write_wait_timeout(zaio_t *aio, int write_wait_timeout);

设置可写超时

void zaio_set_context(zaio_t *aio, const void *ctx);
void *zaio_get_context(zaio_t *aio);

设置/获取上下文

zaio_base_t *zaio_get_aio_base(zaio_t *aio);

获取 zaio_base_t

函数: 停止

void zaio_disable(zaio_t *aio);

停止 aio; 只能在所属 aio_base 运行的线程执行

函数: SSL

void zaio_tls_connect(zaio_t *aio, SSL_CTX * ctx, void (*callback)(zaio_t *aio));

发起 tls 连接, 成功/失败/超时后回调执行 callback

void zaio_tls_accept(zaio_t *aio, SSL_CTX * ctx, void (*callback)(zaio_t *aio));

发起 tls 接受, 成功/失败/超时后回调执行 callback

函数: 读

int zaio_get_read_cache_size(zaio_t *aio);

返回读缓存数据长度

void zaio_get_read_cache(zaio_t *aio, zbuf_t *bf, int strict_len);

从读缓存中获取数据

void zaio_readable(zaio_t *aio, void (*callback)(zaio_t *aio));

可读(或出错)后回调执行函数 callback

void zaio_read(zaio_t *aio, int max_len, void (*callback)(zaio_t *aio));

请求读, 最多读取 max_len 个字节, 成功/失败/超时后回调执行 callback

void zaio_readn(zaio_t *aio, int strict_len, void (*callback)(zaio_t *aio));

请求读, 严格读取 strict_len 个字节, 成功/失败/超时后回调执行 callback

void zaio_read_delimiter(zaio_t *aio, int delimiter, int max_len, void (*callback)(zaio_t *aio));

请求读, 读到 delimiter 为止, 最多读取 max_len 个字节, 成功/失败/超时后回调执行 callback

void zaio_gets(zaio_t *aio, int max_len, void (*callback)(zaio_t *aio))

inline, 读行; 如上

void zaio_get_cint(zaio_t *aio, void (*callback)(zaio_t *aio));

请求读, 读取压缩的 int, 成功/失败/超时后回调执行 callback

void zaio_get_cint_and_data(zaio_t *aio, void (*callback)(zaio_t *aio));

请求读, 读取压缩的 int所指的数据, 成功/失败/超时后回调执行 callback

函数: 写

int zaio_get_write_cache_size(zaio_t *aio);

返回已经写的缓存数据长度

void zaio_get_write_cache(zaio_t *aio, zbuf_t *bf, int strict_len);

从写缓存中获取数据

void zaio_writeable(zaio_t *aio, void (*callback)(zaio_t *aio));

可写(或出错)后回调执行函数 callback

void zaio_cache_printf_1024(zaio_t *aio, const char *fmt, ...);

向缓存格式化写数据, (fmt, ...) 不能超过1024个字节

void zaio_cache_puts(zaio_t *aio, const char *s);

向缓存写字符串 s

void zaio_cache_write(zaio_t *aio, const void *buf, int len);

向缓存写数据

void zaio_cache_write_cint(zaio_t *aio, int len);

向缓存写压缩的 int

void zaio_cache_write_cint_and_data(zaio_t *aio, const void *data, int len);

向缓存写压缩的 int和数据

void zaio_cache_write_direct(zaio_t *aio, const void *buf, int len);

向缓存写数据, 特别注意: 不复制 buf, 只是把 buf 连接到写缓存队列, 使用者需要保证 buf 在上下文的有效性

void zaio_cache_flush(zaio_t *aio, void (*callback)(zaio_t *aio));

请求写, 成功/失败/超时后回调执行 callback

函数: sleep

void zaio_sleep(zaio_t *aio, void (*callback)(zaio_t *aio), int timeout);

请求sleep, timeout 秒后回调执行callback

函数: 环境

extern zaio_base_t *zvar_default_aio_base;

默认 zaio_base_t, master/server 模式下的 zaio_server_main 使用

zaio_base_t *zaio_base_create();

创建 zaio_base_t

void zaio_base_free(zaio_base_t *eb);

释放

zaio_base_t *zaio_base_get_current_pthread_aio_base();

获取当前线程运行的 zaio_base_t

void zaio_base_run(zaio_base_t *eb, void (*loop_fn)());

运行 zaio_base_t; loop_fn: 每次事件循环执行 loop_fn

void zaio_base_stop_notify(zaio_base_t *eb);

通知 zaio_base_t 停止, 既导致 zaio_base_run 返回

void zaio_base_touch(zaio_base_t *eb);

通知 zaio_base_t, 手动打断 epoll_wait

void zaio_base_set_context(zaio_base_t *eb, const void *ctx);
void *zaio_base_get_context(zaio_base_t *eb);

设置/获取上下文

例子

https://gitee.com/linuxmail/lib-zc/blob/master/sample/event/

京ICP备18054515号-2 eli960@qq.com qq: 1537212398