acl  3.5.3.0
acl_ioctl.h
浏览该文件的文档.
1 #ifndef ACL_IOCTL_INCLUDE_H
2 #define ACL_IOCTL_INCLUDE_H
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 
8 #include "../stdlib/acl_define.h"
9 #include "../event/acl_events.h"
10 #include "../stdlib/acl_vstream.h"
11 
12 typedef struct ACL_IOCTL ACL_IOCTL;
13 
14 /**
15  * 当数据流可用时的任务回调函数类型定义, 用户需要根据此函数原型实现自己的任务
16  * @param event_type {int} 数据流的事件状态, 为下列状态之一:
17  * ACL_EVENT_READ: 数据流有数据可读;
18  * ACL_EVENT_WRITE: 数据流有空间可写;
19  * ACL_EVENT_RW_TIMEOUT: 该数据流读写超时;
20  * ACL_EVENT_XCPT: 数据流内部出现异常.
21  * @param ioc {ACL_IOCTL*} io 控制句柄
22  * @param stream {ACL_VSTREAM*} 网络流句柄
23  * @param context {void*} 用户自定义对象
24  */
25 typedef void (*ACL_IOCTL_NOTIFY_FN)(int event_type, ACL_IOCTL *ioc,
26  ACL_VSTREAM *stream, void *context);
27 
28 typedef void (*ACL_IOCTL_WORKER_FN)(ACL_IOCTL *ioc, void *arg);
29 typedef void (*ACL_IOCTL_THREAD_INIT_FN)(void *);
30 typedef void (*ACL_IOCTL_THREAD_EXIT_FN)(void *);
31 
32 /*----------------------------------------------------------------------------*/
33 /* in acl_ioctl.c */
34 /**
35  * 创建一个服务器框架
36  * @param max_threads {int} 所创建的任务池内的最大线程数
37  * @param idle_timeout {int} 每个线程空闲时间, 当某个纯种的空闲时间超过
38  * 此值时会自动退出, 单位为秒
39  * @return {ACL_IOCTL*} 服务器任务池句柄
40  */
41 ACL_API ACL_IOCTL *acl_ioctl_create(int max_threads, int idle_timeout);
42 
43 /**
44  * 创建一个服务器框架
45  * @param event_mode {int} 事件方式: ACL_EVENT_SELECT/ACL_EVENT_KERNEL
46  * @param max_threads {int} 所创建的任务池内的最大线程数
47  * @param idle_timeout {int} 每个线程空闲时间, 当某个纯种的空闲时间超过
48  * 此值时会自动退出, 单位为秒
49  * @param delay_sec {int} 在事件循环中的秒值
50  * @param delay_usec {int} 在事件循环中的微秒值
51  * @return {ACL_IOCTL*} 服务器任务池句柄
52  */
53 ACL_API ACL_IOCTL *acl_ioctl_create_ex(int event_mode, int max_threads,
54  int idle_timeout, int delay_sec, int delay_usec);
55 
56 /**
57  * 为了防止在多线程模式下 select 等事件循环的时间等待,可以添加此项以中断等待,
58  * 加快事件循环过程
59  * @param ioc {ACL_IOCTL*} 服务器任务池句柄
60  */
61 ACL_API void acl_ioctl_add_dog(ACL_IOCTL *ioc);
62 
63 /**
64  * 设置服务器任务池的控制参数
65  * @param ioc {ACL_IOCTL*} 服务器任务池句柄
66  * @param name {int} 参数列表中的第一个参数, ACL_IOCTL_CTL_
67  * @param ... 变参参数序列
68  */
69 ACL_API void acl_ioctl_ctl(ACL_IOCTL *ioc, int name, ...);
70 #define ACL_IOCTL_CTL_END 0 /**< 控制结束标志 */
71 #define ACL_IOCTL_CTL_THREAD_MAX 1 /**< 设置最大线程数 */
72 #define ACL_IOCTL_CTL_THREAD_IDLE 2 /**< 设置线程空闲退出时间 */
73 #define ACL_IOCTL_CTL_DELAY_SEC 3 /**< 设置 select 时的秒级休息值 */
74 #define ACL_IOCTL_CTL_DELAY_USEC 4 /**< 设置 select 时的微秒级休息值 */
75 #define ACL_IOCTL_CTL_INIT_FN 5 /**< 设置线程被创建时的线程初始化函数 */
76 #define ACL_IOCTL_CTL_EXIT_FN 6 /**< 设置线程退出时的线程退出回调函数 */
77 #define ACL_IOCTL_CTL_INIT_CTX 7 /**< 设置线程初始化时的回调参数 */
78 #define ACL_IOCTL_CTL_EXIT_CTX 8 /**< 设置线程退出时的回调参数 */
79 #define ACL_IOCTL_CTL_THREAD_STACKSIZE 9 /**< 设置线程的规模尺寸大小(字节) */
80 
81 /**
82  * 销毁任务池资源
83  * @param ioc {ACL_IOCTL*} 服务器任务池句柄
84  */
85 ACL_API void acl_ioctl_free(ACL_IOCTL *ioc);
86 
87 /**
88  * 启动任务工作池
89  * @param ioc {ACL_IOCTL*} 服务器任务池句柄
90  * @return {int} 是否启动服务器任务池正常. 0: ok; < 0: err.
91  */
92 ACL_API int acl_ioctl_start(ACL_IOCTL *ioc);
93 
94 /**
95  * 消息循环(仅适用于单线程模式)
96  * @param ioc {ACL_IOCTL*} 服务器任务池句柄
97  */
98 ACL_API void acl_ioctl_loop(ACL_IOCTL *ioc);
99 
100 /**
101  * 获得事件引擎句柄
102  * @param ioc {ACL_IOCTL*} 服务器任务池句柄
103  * @return {ACL_EVENT*}
104  */
105 ACL_API ACL_EVENT *acl_ioctl_event(ACL_IOCTL *ioc);
106 
107 /**
108  * 将数据流从事件的读、写监听中去除
109  * @param ioc {ACL_IOCTL*} 服务器任务池句柄
110  * @param stream {ACL_VSTREAM*} 客户端数据流指针
111  */
112 ACL_API void acl_ioctl_disable_readwrite(ACL_IOCTL *ioc, ACL_VSTREAM *stream);
113 
114 /**
115  * 将数据流从事件的读监听中去除
116  * @param ioc {ACL_IOCTL*} 服务器任务池句柄
117  * @param stream {ACL_VSTREAM*} 客户端数据流指针
118  */
119 ACL_API void acl_ioctl_disable_read(ACL_IOCTL *ioc, ACL_VSTREAM *stream);
120 
121 /**
122  * 将数据流从事件的写监听中去除
123  * @param ioc {ACL_IOCTL*} 服务器任务池句柄
124  * @param stream {ACL_VSTREAM*} 客户端数据流指针
125  */
126 ACL_API void acl_ioctl_disable_write(ACL_IOCTL *ioc, ACL_VSTREAM *stream);
127 
128 /**
129  * 判断某个流是否处于受监控状态, 只要读或写任何一种状态均返回真
130  * @param ioc {ACL_IOCTL*} 服务器任务池句柄
131  * @param stream {ACL_VSTREAM*} 客户端数据流指针
132  * @return {int} 1:表示是; 0: 表示否
133  */
134 ACL_API int acl_ioctl_isset(ACL_IOCTL *ioc, ACL_VSTREAM *stream);
135 
136 /**
137  * 判断某个流是否处理于读监控状态
138  * @param ioc {ACL_IOCTL*} 服务器任务池句柄
139  * @param stream {ACL_VSTREAM*} 客户端数据流指针
140  * @return {int} 1:表示是; 0: 表示否
141  */
142 ACL_API int acl_ioctl_isrset(ACL_IOCTL *ioc, ACL_VSTREAM *stream);
143 
144 /**
145  * 判断某个流是否处于写受监控状态
146  * @param ioc {ACL_IOCTL*} 服务器任务池句柄
147  * @param stream {ACL_VSTREAM*} 客户端数据流指针
148  * @return {int} 1:表示是; 0: 表示否
149  */
150 ACL_API int acl_ioctl_iswset(ACL_IOCTL *ioc, ACL_VSTREAM *stream);
151 
152 /**
153  * 设置流状, 当流的IO完成时自动关闭流
154  * @param ioc {ACL_IOCTL*} 服务器任务池句柄
155  * @param stream {ACL_VSTREAM*} 客户端数据流指针
156  * @return {int} 是否真正被关闭
157  * 0: 表示流中还有数据未处理完, 将进入异步关闭过程;
158  * 1: 表示流中无未处理数据, 已经被同步关闭
159  */
160 ACL_API int acl_ioctl_iocp_close(ACL_IOCTL *ioc, ACL_VSTREAM *stream);
161 
162 /**
163  * 向任务池中添加一个读监听工作任务
164  * @param ioc {ACL_IOCTL*} 服务器任务池句柄
165  * @param stream {ACL_VSTREAM*} 客户端数据流指针
166  * @param timeout {int} 流连接空闲超时时间
167  * @param callback {ACL_IOCTL_NOTIFY_FN} 当数据流可读或出错或超时时的回调函数
168  * @param context {void*} 回调函数 callback 的参数之一, 主要用于传递用户自己的参数,
169  * 用户需要在 callback 内将该参数转换成自己的可识别类型
170  */
171 ACL_API void acl_ioctl_enable_read(ACL_IOCTL *ioc, ACL_VSTREAM *stream,
172  int timeout, ACL_IOCTL_NOTIFY_FN callback, void *context);
173 
174 /**
175  * 向任务池中添加一个写监控工作任务
176  * @param ioc {ACL_IOCTL*} 服务器任务池句柄
177  * @param stream {ACL_VSTREAM*} 客户端数据流指针
178  * @param timeout {int} 流连接空闲超时时间
179  * @param callback {ACL_IOCTL_NOTIFY_FN} 当数据流可写或出错或超时时的回调函数
180  * @param context {void*} 回调函数 callback 的参数之一, 主要用于传递用户自己的参数,
181  * 用户需要在 callback 内将该参数转换成自己的可识别类型
182  */
183 ACL_API void acl_ioctl_enable_write(ACL_IOCTL *ioc, ACL_VSTREAM *stream,
184  int timeout, ACL_IOCTL_NOTIFY_FN callback, void *context);
185 
186 /**
187  * 异步地连接服务器, 连接成功或连接超时时后调用用户的回调函数
188  * @param ioc {ACL_IOCTL*} 服务器任务池句柄
189  * @param stream {ACL_VSTREAM*} 处于连接远程服务器状态的本地客户端数据流
190  * @param timeout {int} 连接超时时间
191  * @param callback {ACL_IOCTL_NOTIFY_FN} 当数据流可写或出错或超时时的回调函数
192  * @param context {void*} 回调函数 callback 的参数之一, 主要用于传递用户自己的参数,
193  * 用户需要在 callback 内将该参数转换成自己的可识别类型
194  */
195 ACL_API void acl_ioctl_enable_connect(ACL_IOCTL *ioc, ACL_VSTREAM *stream,
196  int timeout, ACL_IOCTL_NOTIFY_FN callback, void *context);
197 
198 /**
199  * 作为服务端来监听某个待监听地址
200  * @param ioc {ACL_IOCTL*} 服务器任务池句柄
201  * @param stream {ACL_VSTREAM*} 处于连接远程服务器状态的本地客户端数据流
202  * @param timeout {int} 监听套接字监听超时时间, 当此超时时间到达且没有新连接到达时,
203  * 调用者可以在回调函数里处理其它事件, 如果该值为 0 则一直阻塞
204  * 到有新连接到达或出错时用户的回调函数才被调用
205  * @param callback {ACL_IOCTL_NOTIFY_FN} 当有新连接到达或监听套接字出错
206  * 或监听超时时的回调函数
207  * @param context {void*} callback 的参数之一, 参见上面说明
208  */
209 ACL_API void acl_ioctl_enable_listen(ACL_IOCTL *ioc, ACL_VSTREAM *stream,
210  int timeout, ACL_IOCTL_NOTIFY_FN callback, void *context);
211 
212 /*----------------------------------------------------------------------------*/
213 /**
214  * 连接远程服务器
215  * @param addr {const char*} 服务器端服务地址, 格式: ip:port, 如: 192.168.0.1:80
216  * @param timeout {int} 连接超时时间, 其含义如下:
217  * 1) 0: 非阻塞地连接远程服务器
218  * 2) -1: 阻塞地连接远程服务器直至连接成功或连接失败为止
219  * 3) > 0: 带超时地连接远程服务器
220  * @return {ACL_VSTREAM*} 客户端连接流.
221  * != NULL 表示连接成功或正在连接中; == NULL 连接失败或出错
222  * 注:
223  * 当处于上述情况 1) 时, 需要将返回的 ACL_VSTREAM 句柄置入可连接集合中通过回调
224  * 函数来对该流进行读写操作, 即还需要调用 acl_ioctl_enable_connect() 来确保连
225  * 接成功.
226  */
227 ACL_API ACL_VSTREAM *acl_ioctl_connect(const char *addr, int timeout);
228 
229 /**
230  * 创建一个监听套接字流
231  * @param addr {const char*} 本地被监听的地址, 格式: ip:port, 如: 127.0.0.1:80
232  * @param qlen {int} 监听队列长度
233  * @return {ACL_VSTREAM*} 监听套接字数据流. != NULL ok; == NULL err.
234  * 注: 若要异步监听, 则可以调用 acl_ioctl_enable_listen() 来异步地
235  * 获得一个客户端连接
236  */
237 ACL_API ACL_VSTREAM *acl_ioctl_listen(const char *addr, int qlen);
238 
239 /**
240  * 创建一个监听套接字流
241  * @param addr {const char*} 本地被监听的地址, 格式: ip:port, 如: 127.0.0.1:80
242  * @param qlen {int} 监听队列长度
243  * @param block_mode {int} 是否采用非阻塞模式, ACL_BLOCKING: 阻塞模式,
244  * ACL_NON_BLOCKING: 非阻塞模式
245  * @param io_bufsize {int} 获得客户端连接流的缓冲区大小(字节)
246  * @param io_timeout {int} 客户端流的读写超时时间(秒)
247  * @return {ACL_VSTREAM*} 监听套接字数据流. != NULL ok; == NULL err.
248  * 注: 若要异步监听, 则可以调用 acl_ioctl_enable_listen() 来异步地
249  * 获得一个客户端连接
250  */
251 ACL_API ACL_VSTREAM *acl_ioctl_listen_ex(const char *addr, int qlen,
252  int block_mode, int io_bufsize, int io_timeout);
253 
254 /**
255  * 从监听套口获得一个客户端连接
256  * @param sstream {ACL_VSTREAM*} 监听套字流
257  * @param ipbuf {char*} 客户端流的地址
258  * @param size {int} ipbuf 空间大小
259  * @return {ACL_VSTREAM*} 客户端连接流. != NULL 成功获得一个客户端连接的数据流;
260  * == NULL 可能被系统中断了一下, 调用者应忽略此情况
261  */
262 ACL_API ACL_VSTREAM *acl_ioctl_accept(ACL_VSTREAM *sstream,
263  char *ipbuf, int size);
264 
265 /**
266  * 给任务工作池添加一个定时器任务, 该函数仅是 acl_event_request_timer 的简单封装.
267  * @param ioc {ACL_IOCTL*} 服务器任务池句柄
268  * @param timer_fn {ACL_EVENT_NOTIFY_TIME} 定时器任务回调函数.
269  * @param context {void*} timer_fn 的参数之一.
270  * @param idle_limit {acl_int64} 启动定时器函数的时间(微秒级)
271  * @return {acl_int64} 剩余的时间, 单位为微秒.
272  */
273 ACL_API acl_int64 acl_ioctl_request_timer(ACL_IOCTL *ioc,
274  ACL_EVENT_NOTIFY_TIME timer_fn, void *context, acl_int64 idle_limit);
275 
276 /**
277  * 取消某个定时器任务, 该函数仅是 acl_event_cancel_timer 的简单封装.
278  * @param ioc {ACL_IOCTL*} 服务器任务池句柄
279  * @param timer_fn {ACL_EVENT_NOTIFY_TIME} 定时器任务回调函数.
280  * @param context {void*} timer_fn 的参数之一.
281  * @return {acl_int64} 剩余的时间, 单位为微秒.
282  */
283 ACL_API acl_int64 acl_ioctl_cancel_timer(ACL_IOCTL *ioc,
284  ACL_EVENT_NOTIFY_TIME timer_fn, void *context);
285 
286 /**
287  * 向当前线程池中增加一个新的任务
288  * @param ioc {ACL_IOCTL*} 服务器任务池句柄
289  * @param callback {ACL_IOCTL_WORKER_FN} 工作任务的回调函数
290  * @param arg {void*} callback 的参数之一
291  * @return {int} 0: ok; < 0: error
292  */
293 ACL_API int acl_ioctl_add(ACL_IOCTL *ioc,
294  ACL_IOCTL_WORKER_FN callback, void *arg);
295 
296 /**
297  * 获得当前线程池中工作线程的数量.
298  * @param ioc {ACL_IOCTL*} 服务器任务池句柄
299  * @return {int} 返回当前工作线程的数量 == -1: error; >= 0: ok.
300  */
301 ACL_API int acl_ioctl_nworker(ACL_IOCTL *ioc);
302 
303 #ifdef __cplusplus
304 }
305 #endif
306 
307 #endif
HTTP_API void const char * name
Definition: lib_http.h:620
ACL_API int acl_ioctl_add(ACL_IOCTL *ioc, ACL_IOCTL_WORKER_FN callback, void *arg)
ACL_API void acl_ioctl_enable_write(ACL_IOCTL *ioc, ACL_VSTREAM *stream, int timeout, ACL_IOCTL_NOTIFY_FN callback, void *context)
ACL_API ACL_VSTREAM * acl_ioctl_listen(const char *addr, int qlen)
ACL_API void acl_ioctl_disable_read(ACL_IOCTL *ioc, ACL_VSTREAM *stream)
void(* ACL_IOCTL_THREAD_INIT_FN)(void *)
Definition: acl_ioctl.h:29
void(* ACL_IOCTL_NOTIFY_FN)(int event_type, ACL_IOCTL *ioc, ACL_VSTREAM *stream, void *context)
Definition: acl_ioctl.h:25
void(* ACL_IOCTL_WORKER_FN)(ACL_IOCTL *ioc, void *arg)
Definition: acl_ioctl.h:28
struct ACL_IOCTL ACL_IOCTL
Definition: acl_ioctl.h:12
ACL_API ACL_EVENT * acl_ioctl_event(ACL_IOCTL *ioc)
ACL_API ACL_IOCTL * acl_ioctl_create(int max_threads, int idle_timeout)
void(* ACL_IOCTL_THREAD_EXIT_FN)(void *)
Definition: acl_ioctl.h:30
ACL_API void acl_ioctl_loop(ACL_IOCTL *ioc)
ACL_API acl_int64 acl_ioctl_cancel_timer(ACL_IOCTL *ioc, ACL_EVENT_NOTIFY_TIME timer_fn, void *context)
ACL_API int acl_ioctl_isrset(ACL_IOCTL *ioc, ACL_VSTREAM *stream)
ACL_API ACL_VSTREAM * acl_ioctl_connect(const char *addr, int timeout)
ACL_API int acl_ioctl_isset(ACL_IOCTL *ioc, ACL_VSTREAM *stream)
ACL_API void acl_ioctl_enable_listen(ACL_IOCTL *ioc, ACL_VSTREAM *stream, int timeout, ACL_IOCTL_NOTIFY_FN callback, void *context)
ACL_API void acl_ioctl_disable_readwrite(ACL_IOCTL *ioc, ACL_VSTREAM *stream)
ACL_API int acl_ioctl_nworker(ACL_IOCTL *ioc)
ACL_API void acl_ioctl_free(ACL_IOCTL *ioc)
ACL_API void acl_ioctl_disable_write(ACL_IOCTL *ioc, ACL_VSTREAM *stream)
ACL_API int acl_ioctl_start(ACL_IOCTL *ioc)
ACL_API ACL_VSTREAM * acl_ioctl_listen_ex(const char *addr, int qlen, int block_mode, int io_bufsize, int io_timeout)
ACL_API void acl_ioctl_ctl(ACL_IOCTL *ioc, int name,...)
ACL_API void acl_ioctl_enable_connect(ACL_IOCTL *ioc, ACL_VSTREAM *stream, int timeout, ACL_IOCTL_NOTIFY_FN callback, void *context)
ACL_API acl_int64 acl_ioctl_request_timer(ACL_IOCTL *ioc, ACL_EVENT_NOTIFY_TIME timer_fn, void *context, acl_int64 idle_limit)
struct ACL_EVENT ACL_EVENT
Definition: acl_events.h:43
ACL_API int acl_ioctl_iswset(ACL_IOCTL *ioc, ACL_VSTREAM *stream)
ACL_API int acl_ioctl_iocp_close(ACL_IOCTL *ioc, ACL_VSTREAM *stream)
ACL_API ACL_VSTREAM * acl_ioctl_accept(ACL_VSTREAM *sstream, char *ipbuf, int size)
ACL_API ACL_IOCTL * acl_ioctl_create_ex(int event_mode, int max_threads, int idle_timeout, int delay_sec, int delay_usec)
ACL_API void acl_ioctl_add_dog(ACL_IOCTL *ioc)
ACL_API void acl_ioctl_enable_read(ACL_IOCTL *ioc, ACL_VSTREAM *stream, int timeout, ACL_IOCTL_NOTIFY_FN callback, void *context)
void(* ACL_EVENT_NOTIFY_TIME)(int event_type, ACL_EVENT *event, void *context)
Definition: acl_events.h:56