acl  3.5.3.0
acl_listen.h
浏览该文件的文档.
1 #ifndef ACL_LISTEN_INCLUDE_H
2 #define ACL_LISTEN_INCLUDE_H
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 
8 #include "../stdlib/acl_define.h"
9 #ifdef ACL_UNIX
10 #include <sys/socket.h>
11 #include <netdb.h>
12 #endif
13 
14 #define ACL_INET_FLAG_NONE 0
15 #define ACL_INET_FLAG_NBLOCK 1
16 #define ACL_INET_FLAG_REUSEPORT 1 << 1
17 #define ACL_INET_FLAG_FASTOPEN 1 << 2
18 #define ACL_INET_FLAG_EXCLUSIVE 1 << 3
19 
20 /**
21  * 监听套接字接收外来客户端连接
22  * @param sock {ACL_SOCKET} 监听套接字
23  * @param sa {struct sockaddr*} 存储客户端的网络地址,不能为空
24  * @param len {socklen_t*} sa 内存空间大小,不能为空
25  * @return {ACL_SOCKET} 如果返回 ACL_SOCKET_INVALID 表示接收失败
26  */
27 ACL_API ACL_SOCKET acl_sane_accept(ACL_SOCKET sock, struct sockaddr * sa,
28  socklen_t *len);
29 
30 /**
31  * 方便通用的监听套接字的函数,用来接收客户端连接
32  * @param sock {ACL_SOCKET} 监听套接字
33  * @param buf {char*} 当成功接收一个客户端连接后,如果该 buf 非空则存放客户端
34  * 地址,格式:ip:port (针对 TCP 套接口), file_path (针对 UNIX 域套接口)
35  * @param size {size_t} buf 缓冲区大小
36  * @param sock_type {int*} 非空时用来存放客户端 SOCKET 类型,AF_INET/AF_UNIX
37  * @return {ACL_SOCKET} 客户端连接句柄, 返回值 != ACL_SOCKET_INVALID 则表明成
38  * 功收到一个客户端连接
39  */
40 ACL_API ACL_SOCKET acl_accept(ACL_SOCKET sock, char *buf, size_t size,
41  int* sock_type);
42 
43 /* in acl_inet_listen.c */
44 
45 /**
46  * 监听某个网络地址
47  * @param addr {const char*} 网络地址, 格式如:127.0.0.1:8080,当输入地址为
48  * ip:0 时则由操作系统自动分配监听端口号,监听成功后可以调用 acl_getsockname
49  * 获得真正监听的地址
50  * @param backlog {int} 监听套接字系统接收区的队列大小
51  * @param flag {unsigned} 监听标志位,参见:ACL_INET_FLAG_XXX
52  * @return {ACL_SOCKET} 返回监听套接字,如果为 ACL_SOCKET_INVALID 表示无法监听
53  * 该网络地址
54  */
55 ACL_API ACL_SOCKET acl_inet_listen(const char *addr, int backlog, unsigned flag);
56 
57 /**
58  * 接收外来客户端网络连接
59  * @param listen_fd {ACL_SOCKET} 监听套接字
60  * @return {ACL_SOCKET} 客户端连接,如果返回 ACL_SOCKET_INVALID 表示接收客户端
61  * 连接出错
62  */
63 ACL_API ACL_SOCKET acl_inet_accept(ACL_SOCKET listen_fd);
64 
65 /**
66  * 接收外来客户端网络连接
67  * @param listen_fd {ACL_SOCKET} 监听套接字
68  * @param ipbuf {char*} 指针非空且接收客户端连接成功,则其存储客户端的网络地址
69  * @param size {size_t} 如果 ipbuf 不为空则表示 ipbuf 的内存空间大小
70  * @return {ACL_SOCKET} 客户端连接,ACL_SOCKET_INVALID 表示接收客户端连接出错
71  */
72 ACL_API ACL_SOCKET acl_inet_accept_ex(ACL_SOCKET listen_fd, char *ipbuf,
73  size_t size);
74 
75 /* in acl_sane_bind.c */
76 
77 /**
78  * 网络地址绑定函数,适用于 TCP/UDP 套接口
79  * @param res {const struct addrinfo*} 域名解析得到的地址信息对象
80  * @param flag {unsigned int} 标志位
81  * @return {ACL_SOCKET} 返回 ACL_SOCKET_INVALID 表示绑定失败
82  *
83  */
84 ACL_API ACL_SOCKET acl_inet_bind(const struct addrinfo *res, unsigned flag);
85 
86 #ifdef ACL_UNIX
87 
88 /**
89  * 以 UDP 报文方式绑定本地 UNIX 域套接口
90  * @param addr {const char*} UNIX 域套接口地址路径,在 Linux 平台下,如果首字母
91  * 为 '@',则认为是 Linux 下的 abstract unix domain path.
92  * @param flag {unsigned} 标志位
93  * @return {ACL_SOCKET} 返回域套接口,如果返回 ACL_SOCKET_INVALID 表示失败
94  */
95 ACL_API ACL_SOCKET acl_unix_dgram_bind(const char *addr, unsigned flag);
96 #endif
97 
98 /**
99  * 绑定指针的 UDP 地址
100  * @param addr {const char*} UDP 地址,格式:IP:PORT 或 UNIX 域套接口,当为
101  * UNIX 域套接口时的格式为:{domain_path}@udp,其中 @udp 表示为 UDP 域套接口
102  * 后缀;内部自动区别网络套接口和 UNIX 域套接口,域套接口仅支持 UNIX 平台
103  * @param flag {unsigned int} 标志位
104  * @param family {int*} 如果绑定成功且该地址非空则存放地址类型,类型有:
105  * AF_INET, AF_INET6, AF_UNIX
106  * @return {ACL_SOCKET} 返回 ACL_SOCKET_INVALID 表示绑定失败
107  */
108 ACL_API ACL_SOCKET acl_udp_bind3(const char *addr, unsigned flag, int *family);
109 ACL_API ACL_SOCKET acl_udp_bind(const char *addr, unsigned flag);
110 
111 #ifdef ACL_UNIX
112 
113 /* in acl_unix_listen.c */
114 /**
115  * 监听域套接字
116  * @param addr {const char*} 监听域套接字时所用的全路径
117  * @param backlog {int} 监听队列大小
118  * @param flag {unsigned} 监听标志位,参见:ACL_INET_FLAG_XXX
119  * @return {ACL_SOCKET} 监听套接字,ACL_SOCKET_INVALID 表示无法监听该网络地址
120  */
121 ACL_API ACL_SOCKET acl_unix_listen(const char *addr, int backlog, unsigned flag);
122 
123 /**
124  * 从域套接字上接收一个客户端连接
125  * @param fd {ACL_SOCKET} 监听套接字
126  * @return {ACL_SOCKET} 客户端连接,ACL_SOCKET_INVALID 表示接收客户端连接出错
127  */
128 ACL_API ACL_SOCKET acl_unix_accept(ACL_SOCKET fd);
129 
130 /* in acl_fifo_listen.c */
131 
132 ACL_API int acl_fifo_listen(const char *path, int permissions, int mode);
133 
134 #endif
135 
136 #if defined(_WIN32) || defined(_WIN64)
137 # ifdef USE_WSASOCK
138 /* The WSAAccept prototype */
139 /* */typedef SOCKET (WSAAPI *acl_accept_fn)(SOCKET, struct sockaddr FAR *,
140  LPINT, LPCONDITIONPROC, DWORD_PTR);
141 # else
142 /* The accept prototype */
143 typedef SOCKET (WINAPI *acl_accept_fn)(SOCKET, struct sockaddr*, socklen_t*);
144 # endif
145 #else
146 typedef int (*acl_accept_fn)(int, struct sockaddr*, socklen_t*);
147 #endif
148 
149 ACL_API void acl_set_accept(acl_accept_fn fn);
150 
151 #ifdef __cplusplus
152 }
153 #endif
154 
155 #endif
ACL_API ACL_SOCKET acl_udp_bind3(const char *addr, unsigned flag, int *family)
ACL_API ACL_SOCKET acl_udp_bind(const char *addr, unsigned flag)
ACL_API ACL_SOCKET acl_inet_accept(ACL_SOCKET listen_fd)
ACL_API void acl_set_accept(acl_accept_fn fn)
ACL_API ACL_SOCKET acl_inet_accept_ex(ACL_SOCKET listen_fd, char *ipbuf, size_t size)
ACL_API ACL_SOCKET acl_accept(ACL_SOCKET sock, char *buf, size_t size, int *sock_type)
ACL_API ACL_SOCKET acl_inet_bind(const struct addrinfo *res, unsigned flag)
int(* acl_accept_fn)(int, struct sockaddr *, socklen_t *)
Definition: acl_listen.h:146
ACL_API ACL_SOCKET acl_sane_accept(ACL_SOCKET sock, struct sockaddr *sa, socklen_t *len)
ACL_API ACL_SOCKET acl_inet_listen(const char *addr, int backlog, unsigned flag)