acl  3.5.3.0
acl_iostuff.h
浏览该文件的文档.
1 #ifndef ACL_IOSTUFF_INCLUDE_H
2 #define ACL_IOSTUFF_INCLUDE_H
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 
8 #include "acl_define.h"
9 #include "acl_vstream.h"
10 
11 #define ACL_CLOSE_ON_EXEC 1 /**< 标志位, 调用 exec 后自动关闭打开的描述字 */
12 #define ACL_PASS_ON_EXEC 0
13 
14 #define ACL_BLOCKING 0 /**< 阻塞读写标志位 */
15 #define ACL_NON_BLOCKING 1 /**< 非阻塞读写标志位 */
16 
17 /**
18  * 设置套接口为阻塞或非阻塞
19  * @param fd {ACL_SOCKET} SOCKET 套接字
20  * @param on {int} 是否设置该套接字为非阻塞, ACL_BLOCKING 或 ACL_NON_BLOCKING
21  * @return {int} >= 0: 成功, 返回值 > 0 表示设置之前的标志位; -1: 失败
22  */
23 ACL_API int acl_non_blocking(ACL_SOCKET fd, int on);
24 
25 /**
26  * 判断所给套按口是否为阻塞模式
27  * @param fd {ACL_SOCKET} SOCKET 套接字
28  * @return {int} -1 表示出错或所给参数有误或该平台不支持,1 表示所给套接字为阻塞模式
29  * 0 表示所给套接字为非阻塞模式
30  */
31 ACL_API int acl_is_blocking(ACL_SOCKET fd);
32 
33 /**
34  * 写等待操作,直到套接字可写、出错或超时
35  * @param fd {ACL_SOCKET} 描述符
36  * @param timeout {int} 超时时间,单位为秒,该值分下面三种情形:
37  * > 0 : 表示最大超时时间的秒数,
38  * == 0 : 表示不等待,检测完后立即返回
39  * < 0 : 时表示直接该套接字可读或出错为止
40  * @return {int} 0: 可写; -1: 失败或超时
41  */
42 ACL_API int acl_write_wait(ACL_SOCKET fd, int timeout);
43 
44 /**
45  * 写等待操作,直到套接字可写、出错或超时
46  * @param fd {ACL_SOCKET} 描述符
47  * @param timeout {int} 超时时间,单位为毫秒,该值分下面三种情形:
48  * > 0 : 表示最大超时时间的秒数,
49  * == 0 : 表示不等待,检测完后立即返回
50  * < 0 : 时表示直接该套接字可读或出错为止
51  * @return {int} 0: 可写; -1: 失败或超时
52  */
53 ACL_API int acl_write_wait_ms(ACL_SOCKET fd, int timeout);
54 
55 /**
56  * 读等待操作,直到套接字有数据可读、出错或超时
57  * @param fd {ACL_SOCKET} 描述符
58  * @param timeout {int} 超时时间,单位为秒,该值分下面三种情形:
59  * > 0 : 表示最大超时时间的秒数,
60  * == 0 : 表示不等待,检测完后立即返回
61  * < 0 : 时表示直接该套接字可读或出错为止
62  * @return {int} 0: 有数据可读或描述字出错; -1: 失败或超时
63  */
64 ACL_API int acl_read_wait(ACL_SOCKET fd, int timeout);
65 
66 /**
67  * 读等待操作,直到套接字有数据可读、出错或超时
68  * @param fd {ACL_SOCKET} 描述符
69  * @param timeout {int} 超时时间,单位为毫秒,该值分下面三种情形:
70  * > 0 : 表示最大超时时间的秒数,
71  * == 0 : 表示不等待,检测完后立即返回
72  * < 0 : 时表示直接该套接字可读或出错为止
73  * @return {int} 0: 有数据可读或描述字出错; -1: 失败或超时
74  */
75 ACL_API int acl_read_wait_ms(ACL_SOCKET fd, int timeout);
76 
77 #if defined(ACL_LINUX) && !defined(MINGW)
78 /**
79  * 采用 epoll 方式的读等待
80  * @param fd {ACL_SOCKET} 描述符
81  * @param delay {int} 毫秒级等待时间
82  * @return {int} 含义同上
83  */
84 ACL_API int acl_read_epoll_wait(ACL_SOCKET fd, int delay);
85 #endif
86 
87 #if defined(ACL_UNIX)
88 /**
89  * 采用 poll 方式的读等待
90  * @param fd {ACL_SOCKET} 描述符
91  * @param delay {int} 毫秒级等待时间
92  * @return {int} 含义同上
93  */
94 ACL_API int acl_read_poll_wait(ACL_SOCKET fd, int delay);
95 #endif
96 
97 /**
98  * 采用 select 方式的读等待
99  * @param fd {ACL_SOCKET} 描述符
100  * @param delay {int} 毫秒级等待时间
101  * @return {int} 含义同上
102  */
103 ACL_API int acl_read_select_wait(ACL_SOCKET fd, int delay);
104 
105 /**
106  * 毫秒级别睡眠
107  * @param delay {unsigned} 毫秒值
108  */
109 ACL_API void acl_doze(unsigned delay);
110 
111 /**
112 * 某个描述符是否可读
113 * @param fd {ACL_SOCKET} 描述符
114 * @return {int} 0: 不可读; -1: 出错, 1:可读
115 */
116 ACL_API int acl_readable(ACL_SOCKET fd);
117 
118 /**
119  * 超时读数据
120  * @param fd {ACL_SOCKET} 网络套接字
121  * @param buf {void*} 存储区,不能为空
122  * @param len {unsigned} buf 存储区大小
123  * @param timeout {int} 超时时间,单位为秒,该值分下面三种情形:
124  * > 0 : 表示最大超时时间的秒数,
125  * == 0 : 表示不等待,检测完后立即返回
126  * < 0 : 时表示直接该套接字可读或出错为止
127  * @return {int} > 0 读的数据; -1: 出错
128 */
129 ACL_API int acl_timed_read(ACL_SOCKET fd, void *buf, unsigned len,
130  int timeout, void *unused_context);
131 
132 /**
133  * 超时写数据
134  * @param fd {ACL_SOCKET} 网络套接字
135  * @param buf {void*} 数据存储区,不能为空
136  * @param len {unsigned} 数据长度大小
137  * @param timeout {int} 超时时间,单位为秒,该值分下面三种情形:
138  * > 0 : 表示最大超时时间的秒数,
139  * == 0 : 表示不等待,检测完后立即返回
140  * < 0 : 时表示直接该套接字可读或出错为止
141  * @return {int} > 0 成功写入的数据; -1: 出错
142  */
143 ACL_API int acl_timed_write(ACL_SOCKET fd, void *buf, unsigned len,
144  int timeout, void *unused_context);
145 
146 /**
147  * 向描述符中循环写入数据,直到写完、出错或超时为止
148  * @param fd {ACL_SOCKET} 网络套接字
149  * @param buf {void*} 数据存储区,不能为空
150  * @param len {unsigned} 数据长度大小
151  * @param timeout {int} 超时时间,单位为秒
152  * @return {int} 成功写入的长度
153  */
154 ACL_API int acl_write_buf(ACL_SOCKET fd, const char *buf, int len, int timeout);
155 
156 /**
157  * 探测套接字中系统缓存区的数据长度
158  * @param fd {ACL_SOCKET} 描述符
159  * @return {int} 系统缓存区数据长度
160  */
161 ACL_API int acl_peekfd(ACL_SOCKET fd);
162 
163 /**
164  * 创建管道
165  * @param fds {ACL_FILE_HANDLE [2]} 存储结果
166  * @return {int} 0: ok; -1: error
167  */
168 ACL_API int acl_pipe(ACL_FILE_HANDLE fds[2]);
169 
170 /**
171  * 关闭管道对
172  * @param fds {ACL_FILE_HANDLE[2]} 管道对
173  * @return {int} 0: ok; -1: error
174  */
175 ACL_API int acl_pipe_close(ACL_FILE_HANDLE fds[2]);
176 
177 /**
178 * 产生一个管道对
179 * @param fds {ACL_FILE_HANDLE[2]} 存储产生的管道对地址,不能为空
180 * @return 0: ok; -1: error
181 */
182 ACL_API int acl_duplex_pipe(ACL_FILE_HANDLE fds[2]);
183 
184 #ifdef ACL_UNIX
185 /**
186  * 设置文件描述符标志位,当调用 exec 后该描述符自动被关闭
187  * @param fd {int} 文件描述符
188  * @param on {int} ACL_CLOSE_ON_EXEC 或 0
189  * @return {int} 0: ok; -1: error
190  */
191 ACL_API int acl_close_on_exec(int fd, int on);
192 
193 /**
194  * 从某个文件描述符开始关闭之后的所有打开的文件描述符
195  * @param lowfd {int} 被关闭描述符的最低值
196  * @return {int} 0: ok; -1: error
197  */
198 ACL_API int acl_closefrom(int lowfd);
199 
200 /**
201  * 设定当前进程可以打开最大文件描述符值
202  * @param limit {int} 设定的最大值
203  * @return {int} >=0: ok; -1: error
204  */
205 ACL_API int acl_open_limit(int limit);
206 
207 /**
208  * 判断给定某个文件描述字是否是套接字
209  * @param fd {int} 文件描述符
210  * @return {int} != 0: 是; 0: 否
211  */
212 ACL_API int acl_issock(int fd);
213 #endif
214 
215 ACL_API void acl_set_delay_slice(int n);
216 
217 #if defined(_WIN32) || defined(_WIN64)
218 typedef int (WINAPI *acl_select_fn)(int, fd_set*, fd_set*,
219  fd_set*, const struct timeval*);
220 # if(_WIN32_WINNT >= 0x0600)
221 # define ACL_HAS_POLL
222 typedef int (WINAPI *acl_poll_fn)(struct pollfd*, unsigned long, int);
223 ACL_API void acl_set_poll(acl_poll_fn fn);
224 # endif
225 
226 #else
227 #include <poll.h>
228 # define ACL_HAS_POLL
229 
230 typedef int (*acl_select_fn)(int, fd_set*, fd_set*, fd_set*, struct timeval*);
231 typedef int (*acl_poll_fn)(struct pollfd*, nfds_t, int);
232 ACL_API void acl_set_poll(acl_poll_fn fn);
233 #endif
234 
235 ACL_API void acl_set_select(acl_select_fn fn);
236 
237 #ifdef __cplusplus
238 }
239 #endif
240 
241 #endif
ACL_API void acl_set_delay_slice(int n)
ACL_API int acl_pipe_close(ACL_FILE_HANDLE fds[2])
ACL_API int acl_duplex_pipe(ACL_FILE_HANDLE fds[2])
ACL_API void acl_set_select(acl_select_fn fn)
ACL_API void acl_set_poll(acl_poll_fn fn)
int(* acl_select_fn)(int, fd_set *, fd_set *, fd_set *, struct timeval *)
Definition: acl_iostuff.h:230
ACL_API int acl_timed_write(ACL_SOCKET fd, void *buf, unsigned len, int timeout, void *unused_context)
ACL_API int acl_non_blocking(ACL_SOCKET fd, int on)
ACL_API int acl_write_wait_ms(ACL_SOCKET fd, int timeout)
int(* acl_poll_fn)(struct pollfd *, nfds_t, int)
Definition: acl_iostuff.h:231
ACL_API int acl_timed_read(ACL_SOCKET fd, void *buf, unsigned len, int timeout, void *unused_context)
ACL_API int acl_read_select_wait(ACL_SOCKET fd, int delay)
ACL_API void acl_doze(unsigned delay)
ACL_API int acl_peekfd(ACL_SOCKET fd)
ACL_API int acl_read_wait(ACL_SOCKET fd, int timeout)
ACL_API int acl_is_blocking(ACL_SOCKET fd)
ACL_API int acl_readable(ACL_SOCKET fd)
ACL_API int acl_pipe(ACL_FILE_HANDLE fds[2])
ACL_API int acl_write_wait(ACL_SOCKET fd, int timeout)
ACL_API int acl_read_wait_ms(ACL_SOCKET fd, int timeout)
ACL_API int acl_write_buf(ACL_SOCKET fd, const char *buf, int len, int timeout)