Modify licenses
[scp/ocu/5gnr.git] / Include / vos_socket.h
1 /******************************************************************************
2 *
3 *   Copyright (c) 2020 ICT/CAS.
4 *
5 *   Licensed under the O-RAN Software License, Version 1.0 (the "Software License");
6 *   you may not use this file except in compliance with the License.
7 *   You may obtain a copy of the License at
8 *
9 *       https://www.o-ran.org/software
10 *
11 *   Unless required by applicable law or agreed to in writing, software
12 *   distributed under the License is distributed on an "AS IS" BASIS,
13 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *   See the License for the specific language governing permissions and
15 *   limitations under the License.
16 *
17 *******************************************************************************/
18
19
20
21
22 #ifndef __VOS_SOCKET_H__
23 #define __VOS_SOCKET_H__
24
25 #ifdef  __cplusplus
26 extern "C"{
27 #endif
28
29 #include "vos_types.h"
30 #include <unistd.h>
31 #include <sys/un.h>
32 #include <sys/socket.h>
33 #include <netinet/in.h>
34 #include <net/if.h>
35 #include <sys/ioctl.h>
36 #include <netpacket/packet.h>
37 #include "vos_sctp.h"
38 #include "vos_linklist.h"
39
40 /**
41  * socket地址联合体,可用于IPv4,IPv6,和unix类型的socket
42  */
43 typedef union vos_sockaddr_u
44 {
45     struct sockaddr         sa;     ///< 通用结构
46     struct sockaddr_in      sin;    ///< IPv4 结构
47     struct sockaddr_in6     sin6;   ///< IPv6 结构
48     struct sockaddr_un      un;     ///< unix 结构
49     struct sockaddr_ll      raw;    ///< raw 结构
50 }vos_sockaddr_t;
51
52 /**
53  * 协议族
54 */
55 typedef enum vos_domain_e{
56     VOS_AF_UNIX  = AF_UNIX,     ///< unix socket
57     VOS_AF_INET  = AF_INET,     ///< ipv4
58     VOS_AF_INET6 = AF_INET6,    ///< ipv6
59     VOS_AF_PACKET= AF_PACKET,   ///< 用于raw socket
60 }vos_domain_t;
61
62 /**
63  * socket类型
64 */
65 typedef enum vos_socktype_e{
66     VOS_SOCK_STREAM = SOCK_STREAM,  ///< TCP
67     VOS_SOCK_DGRAM  = SOCK_DGRAM,   ///< UDP
68     VOS_SOCK_RAW    = SOCK_RAW,     ///< raw socket
69     VOS_SOCK_SEQPACKET    = SOCK_SEQPACKET,     ///< sctp one2many
70 }vos_socktype_t;
71
72
73 /**
74  * 将IP地址结构转换成IP地址字符串
75  * @param[in ]   af           协议族,VOS_AF_INET 或 VOS_AF_INET6
76  * @param[in ]   src          IP地址结构
77  * @param[out]   dst          用于存储转换结果的buf,
78  * @param[in ]   size         buf的大小
79  * @return       成功返回指向dst的指针,失败返回 NULL
80 */
81 const CHAR *vos_inet_ntop(LONG af, const vos_sockaddr_t *src,CHAR *dst, socklen_t size);
82
83
84 /**
85  * 将IP地址字符串转换成IP地址结构
86  * @param[in ]   af           协议族,VOS_AF_INET 或 VOS_AF_INET6
87  * @param[in ]   src          IP地址字符串
88  * @param[out]   dst          用于存储转换结果的IP地址结构,
89  * @return       成功返回 VOS_OK,失败则返回其他
90 */
91 LONG vos_inet_pton(LONG af, const CHAR *src, vos_sockaddr_t *dst);
92
93
94
95 /**
96  * 创建socket
97  * @param[in ]   domain        协议族
98  * @param[in ]   type          socket类型
99  * @param[out]   protocol      协议,一般填0
100  * @return       成功返回 文件描述符,失败则返回 其他
101 */
102 LONG vos_socket(vos_domain_t domain,vos_socktype_t type,LONG protocol);
103
104 /**
105  * 为socket绑定地址
106  * @param[in ]   sockfd        要绑定的socket
107  * @param[in ]   my_addr       地址结构
108  * @return       成功返回 VOS_OK ,失败则返回 其他
109 */
110 LONG vos_bind(LONG sockfd,vos_sockaddr_t *my_addr);
111
112
113
114 /**
115  * 为socket绑定地址
116  * @param[in ]   sockfd        要绑定的socket
117  * @param[in ]   family        协议族
118  * @param[in ]   port          端口号,当family为 VOS_AF_INET 和 VOS_AF_INET6 有效
119  * @param[in ]   addrStr       地址字符串,
120                                     当family为 VOS_AF_INET 和 VOS_AF_INET6 时为IP地址字符串,
121                                     当family为 VOS_AF_UNIX 时 为本地文件路径字符串
122  * @param[in ]   protocol      协议,当family为 VOS_AF_PACKET 时有效,为协议类型
123  * @param[in ]   ifName        网口名,当family为 VOS_AF_PACKET 时有效,为绑定的网口名
124  * @return       成功返回 VOS_OK ,失败则返回 其他
125 */
126 LONG vos_bind_str(LONG sockfd,vos_domain_t family,SHORT port,const CHAR *addrStr,SHORT protocol,const CHAR *ifName);
127
128
129 /**
130  * 监听socket
131  * @param[in ]   sockfd        欲监听的socket
132  * @param[in ]   maxClient     最大连接数
133  * @return       成功返回 VOS_OK ,失败则返回 其他
134 */
135 LONG vos_listen(LONG sockfd, LONG maxClient);
136
137
138 /**
139  * 获得连接请求
140  * @param[in ]   sockfd        被监听的socket
141  * @param[in ]   addr          客户端地址
142  * @return       成功返回 VOS_OK ,失败则返回 其他
143 */
144 LONG vos_accept(LONG sockfd,vos_sockaddr_t *addr);
145
146
147
148 /**
149  * 建立与指定socket的连接
150  * @param[in ]   sockfd        欲建立连接的socket
151  * @param[in ]   con_addr      服务端地址
152  * @return       成功返回 VOS_OK ,失败则返回 其他
153 */
154 LONG vos_connect(LONG sockfd,vos_sockaddr_t *con_addr);
155
156
157
158 /**
159  * 建立与指定socket的连接
160  * @param[in ]   sockfd        欲建立连接的socket
161  * @param[in ]   family        协议族
162  * @param[in ]   port          端口号,当family为 VOS_AF_INET 和 VOS_AF_INET6 有效
163  * @param[in ]   addrStr       服务端地址字符串,
164                                     当family为 VOS_AF_INET 和 VOS_AF_INET6 时为IP地址字符串,
165                                     当family为 VOS_AF_UNIX 时 为本地文件路径字符串
166  * @return       成功返回 VOS_OK ,失败则返回 其他
167 */
168 LONG vos_connect_str(LONG sockfd,vos_domain_t family,SHORT port,const CHAR *addrStr);
169
170
171 /**
172  * 从已连接的socket的接收数据
173  * @param[in ]   sockfd        已建立连接的socket
174  * @param[in ]   buf           存储数据的缓冲区
175  * @param[in ]   len           buf的大小
176  * @param[in ]   flags         参考 系统 recv 函数
177  * @return       成功返回 接收的字节数 ,失败则返回 VOS_ERROR
178 */
179 LONG vos_recv(LONG sockfd, VOID *buf, size_t len, LONG flags);
180
181 /**
182  * 向已连接的socket的发送数据
183  * @param[in ]   sockfd        已建立连接的socket
184  * @param[in ]   buf           存储数据的缓冲区
185  * @param[in ]   len           buf的大小
186  * @param[in ]   flags         参考 系统 recv 函数
187  * @return       成功返回 发送的字节数 ,失败则返回 VOS_ERROR
188 */
189 LONG vos_send(LONG sockfd, const VOID *buf, size_t len, LONG flags);
190
191 /**
192  * 从socket中接收数据
193  * @param[in ]   sockfd        socket
194  * @param[in ]   buf           存储数据的缓冲区
195  * @param[in ]   len           buf的大小
196  * @param[in ]   flags         参考 系统 recv 函数
197  * @param[in ]   src_addr      数据来源端的地址
198  * @return       成功返回 接收的字节数 ,失败则返回 VOS_ERROR
199 */
200 LONG vos_recvfrom(LONG sockfd, void *buf, size_t len, LONG flags,vos_sockaddr_t *src_addr);
201
202 /**
203  * 向socket中发送数据
204  * @param[in ]   sockfd        socket
205  * @param[in ]   buf           存储数据的缓冲区
206  * @param[in ]   len           buf的大小
207  * @param[in ]   flags         参考 系统 sendto 函数
208  * @param[in ]   dest_addr     数据发送的目的地址
209  * @return       成功返回 发送的字节数 ,失败则返回 VOS_ERROR
210 */
211 LONG vos_sendto(LONG sockfd, const void *buf, size_t len, LONG flags,const vos_sockaddr_t *dest_addr);
212
213
214
215 /**
216  * 获取 本地的 IP 地址
217  * @param[in ]   sockfd        socket
218  * @param[out]   addr          用于存放地址
219  * @return       成功返回 地址个数,失败则返回 VOS_ERROR
220 */
221 LONG vos_getsockname(LONG sockfd,vos_sockaddr_t *addr);
222
223 /**
224  * 获取 对端的 IP 地址
225  * @param[in ]   sockfd       socket
226  * @param[out]   addr         用于存放地址
227  * @return       成功返回 地址个数,失败则返回 VOS_ERROR
228 */
229 LONG vos_getpeername(LONG sockfd, vos_sockaddr_t *addr);
230
231
232 /**
233  * 向raw socket中发送数据
234  * @param[in ]   sockfd        socket
235  * @param[in ]   ifName        用于数据发送的网口名
236  * @param[in ]   buf           存储数据的缓冲区
237  * @param[in ]   len           buf的大小
238  * @param[in ]   flags         参考 系统 sendto 函数
239  * @return       成功返回 发送的字节数 ,失败则返回 VOS_ERROR
240 */
241 LONG vos_raw_sendto(LONG sockfd,const CHAR *ifName, const void *buf, size_t len, LONG flags);
242
243
244 /**
245  * 填充vos_sockaddr_t地址结构
246  * @param[in ]   socket        相关的socket,当family 为VOS_AF_PACKET时有效
247  * @param[out]   my_addr       被填充的 vos_sockaddr_t 变量
248  * @param[in ]   family        协议族
249  * @param[in ]   port          端口号,当family为 VOS_AF_INET 和 VOS_AF_INET6 有效
250  * @param[in ]   addrStr       地址字符串,
251                                     当family为 VOS_AF_INET 和 VOS_AF_INET6 时为IP地址字符串,
252                                     当family为 VOS_AF_UNIX 时 为本地文件路径字符串
253  * @param[in ]   protocol      协议,当family为 VOS_AF_PACKET 时有效,为协议类型
254  * @param[in ]   ifName        网口名,当family为 VOS_AF_PACKET 时有效,为绑定的网口名
255  * @return       成功返回 VOS_OK ,失败则返回 其他
256 */
257 LONG vos_addr_fill(LONG socket,vos_sockaddr_t *my_addr,vos_domain_t family,SHORT port,const CHAR *addrStr,SHORT protocol,const CHAR *ifName);
258
259
260 /**
261  * 获取本机网口的MAC地址
262  * @param[in ]   ifName        网口名
263  * @param[out]   addr          MAC 地址
264  * @return       成功返回 VOS_OK ,失败则返回 其他
265 */
266 LONG vos_get_if_mac_addr(const CHAR *ifName,UCHAR addr[6]);
267
268 /**
269  * 创建unix udp socket,包含创建、绑定和监听
270  * @param[in ]   local_path       本地文件路径
271  * @param[in ]   isbind           是否绑定端口
272  * @return       成功返回 文件描述符,失败则返回 其他
273 */
274 LONG vos_unix_udp_socket_create(const CHAR *local_path,BOOL isbind);
275
276
277 /**
278  * 创建unix tcp socket,包含创建、绑定和监听
279  * @param[in ]   local_path       本地文件路径
280  * @param[in ]   maxClient        最大连接数
281  * @return       成功返回 文件描述符,失败则返回 其他
282 */
283 LONG vos_unix_tcp_server_socket_create(const CHAR *local_path, LONG maxClient);
284
285
286 /**
287  * 创建unix tcp socket,包含创建和连接
288  * @param[in ]   local_path       本地文件路径
289  * @return       成功返回 文件描述符,失败则返回 其他
290 */
291 LONG vos_unix_tcp_client_socket_create(const CHAR *local_path);
292
293
294 /**
295  * 创建tcp socket,包含创建、绑定和监听
296  * @param[in ]   family        VOS_AF_INET 和 VOS_AF_INET6
297  * @param[in ]   addrStr       IPv4/IPv6 地址
298  * @param[in ]   port          端口号
299  * @param[in ]   maxClient     最大连接数
300  * @return       成功返回 文件描述符,失败则返回 其他
301 */
302 LONG vos_tcp_server_socket_create(vos_domain_t family,const CHAR *addrStr,SHORT port, LONG maxClient);
303
304 /**
305  * 创建tcp socket,包含创建和连接
306  * @param[in ]   family        VOS_AF_INET 和 VOS_AF_INET6
307  * @param[in ]   addrStr       IPv4/IPv6 地址
308  * @param[in ]   port          端口号
309  * @return       成功返回 文件描述符,失败则返回 其他
310 */
311 LONG vos_tcp_client_socket_create(vos_domain_t family,const CHAR *addrStr,SHORT port);
312
313 /**
314  * 创建udp socket,包含创建、绑定
315  * @param[in ]   family        VOS_AF_INET 和 VOS_AF_INET6
316  * @param[in ]   addrStr       IPv4/IPv6 地址
317  * @param[in ]   port          端口号
318  * @return       成功返回 文件描述符,失败则返回 其他
319 */
320 LONG vos_udp_server_socket_create(vos_domain_t family,const CHAR *addrStr,SHORT port);
321
322 /**
323  * 创建udp socket,包含创建并返回server 地址结构
324  * @param[in ]   family          VOS_AF_INET 和 VOS_AF_INET6
325  * @param[in ]   s_addrStr       IPv4/IPv6 地址
326  * @param[in ]   s_port          端口号
327  * @param[out]   s_addr          s_addr 由s_addrStr和s_port生成的地址结构
328  * @return       成功返回 文件描述符,失败则返回 其他
329 */
330 LONG vos_udp_client_socket_create(vos_domain_t family,const CHAR *s_addrStr,SHORT s_port,vos_sockaddr_t *s_addr);
331
332
333 /**
334  * 创建raw socket,包含创建、绑定
335  * @param[in ]   protocol      协议
336  * @param[in ]   ifName        网口名
337  * @return       成功返回 文件描述符,失败则返回 其他
338 */
339 LONG vos_raw_server_socket_create(SHORT protocol,const CHAR *ifName);
340
341
342 /**
343  * 创建sctp socket 绑定,可以指定多个地址,
344  * 如果 sock 参数为 IPv4 套接字,则传送给 sctp_bindx() 函数的地址必须为 IPv4 地址。
345  * 如果 sock 参数为 IPv6 套接字,则传送给 sctp_bindx() 函数的地址可以为 IPv4 或 IPv6 地址。
346  * @param[in ]   sockfd        要绑定的socket
347  * @param[in ]   addrs         地址数组
348  * @param[in ]   addrcnt       地址个数
349  * @param[in ]   flags         有如下取值:
350  *                  SCTP_BINDX_ADD_ADDR 指示 SCTP 将给定地址添加到关联中
351  *                  SCTP_BINDX_REM_ADDR 指示 SCTP 从关联中删除给定地址
352  * @return       成功返回 VOS_OK,失败则返回 其他
353 */
354 LONG vos_sctp_bindx(LONG sockfd, vos_sockaddr_t *addrs, LONG addrcnt, LONG flags);
355
356
357 /**
358  * 创建sctp socket 绑定,可以指定多个地址,
359  * 如果 sock 参数为 IPv4 套接字,则传送给 sctp_bindx() 函数的地址必须为 IPv4 地址。
360  * 如果 sock 参数为 IPv6 套接字,则传送给 sctp_bindx() 函数的地址可以为 IPv4 或 IPv6 地址。
361  * @param[in ]   sockfd        要绑定的socket
362  * @param[in ]   family        协议族,VOS_AF_INET 和 VOS_AF_INET6 有效
363  * @param[in ]   port          端口号
364  * @param[in ]   addrStr       地址字符串数组
365  * @param[in ]   addrcnt       地址个数
366  * @param[in ]   flags         有如下取值:
367  *                  SCTP_BINDX_ADD_ADDR 指示 SCTP 将给定地址添加到关联中
368  *                  SCTP_BINDX_REM_ADDR 指示 SCTP 从关联中删除给定地址
369  * @return       成功返回 VOS_OK,失败则返回 其他
370 */
371 LONG vos_sctp_bindx_str(LONG sockfd,vos_domain_t family,SHORT port,CHAR *addrStr[], LONG addrcnt, LONG flags);
372
373
374
375 /**
376  * 建立与指定socket的连接
377  * @param[in ]   sockfd        欲建立连接的socket
378  * @param[in ]   addrs         地址数组
379  * @param[in ]   addrcnt       地址个数
380  * @param[out]   id            关联ID
381  * @return       成功返回 VOS_OK ,失败则返回 其他
382 */
383 LONG vos_sctp_connectx(LONG sockfd, vos_sockaddr_t *addrs, LONG addrcnt,sctp_assoc_t *id);
384
385
386 /**
387  * 建立与指定socket的连接
388  * @param[in ]   sockfd        欲建立连接的socket
389  * @param[in ]   family        协议族
390  * @param[in ]   port          端口号,当family为 VOS_AF_INET 和 VOS_AF_INET6 有效
391  * @param[in ]   addrStr       地址字符串数组
392  * @param[in ]   addrcnt       地址个数
393  * @param[out]   id            关联ID
394  * @return       成功返回 VOS_OK ,失败则返回 其他
395 */
396 LONG vos_sctp_connectx_str(LONG sockfd,vos_domain_t family,SHORT port,CHAR *addrStr[], LONG addrcnt,sctp_assoc_t *id);
397
398
399 /**
400  * 向socket发送数据
401  * @param[in ]   sockfd        socket
402  * @param[in ]   msg           存储数据的缓冲区
403  * @param[in ]   len           msg的大小
404  * @param[in ]   sinfo         包含用于发送消息的参数。可以指定,流、ppid、TTL、关联 ID等。
405  * @param[in ]   flags         此值在将逻辑运算 OR 以按位形式应用于以下零个或多个标志位时形成:
406  *                              MSG_UNORDERED :设置此标志之后,vos_sctp_sendmsg() 函数将无序传送消息。
407  *                              MSG_ADDR_OVER:设置此标志之后,vos_sctp_sendmsg() 函数将使用 to 参数中的地址,而不使用关联的主要目标地址。此标志仅用于一对多风格 SCTP 套接字。
408  *                              MSG_ABORT:设置此标志之后,指定的关联将异常中止,同时向其对等方发送 ABORT 信号。此标志仅用于一对多风格 SCTP 套接字。
409  *                              MSG_EOF:设置此标志之后,指定的关联将进入正常关闭状态。此标志仅用于一对多风格 SCTP 套接字。
410  * @return       成功返回 发送的字节数 ,失败则返回 VOS_ERROR
411 */
412 LONG vos_sctp_send(LONG sockfd, const void *msg, size_t len,const struct sctp_sndrcvinfo *sinfo, LONG flags);
413
414
415
416 /**
417  * 向socket发送数据
418  * @param[in ]   sockfd        socket
419  * @param[in ]   msg           存储数据的缓冲区
420  * @param[in ]   len           msg的大小
421  * @param[in ]   to            目的地址
422  * @param[in ]   ppid          协议无关的一个自定义值,一般填0即可
423  * @param[in ]   flags         同vos_sctp_send
424  * @param[in ]   stream_no     此消息的目标流
425  * @param[in ]   timetolive    TTL 以毫秒为单位,0表示无限生命期。
426  * @param[in ]   context       一个本地标志,用于检测无法发送到对端的消息,一般填0即可
427  * @return       成功返回 发送的字节数 ,失败则返回 VOS_ERROR
428 */
429 LONG vos_sctp_sendmsg(LONG sockfd, const void *msg, size_t len, vos_sockaddr_t *to,
430                         LONG ppid, LONG flags,
431                         LONG stream_no, LONG timetolive, LONG context);
432
433
434
435 /**
436  * 从socket接收数据
437  * @param[in ]   sockfd        socket
438  * @param[out]   msg           存储数据的缓冲区
439  * @param[in ]   len           msg的大小
440  * @param[in ]   from          源地址
441  * @param[out]   sinfo         包含接收消息的参数。包含流、ppid、TTL、关联 ID等。
442  * @param[out]   msg_flags     同vos_sctp_send
443  * @return       成功返回 接收的字节数 ,失败则返回 VOS_ERROR
444 */
445 LONG vos_sctp_recvmsg(LONG sockfd, void *msg, size_t len, vos_sockaddr_t *from,
446                         struct sctp_sndrcvinfo *sinfo,
447                         LONG *msg_flags);
448
449 /**
450  * 获取 socket 选项参数
451  * @param[in ]   sockfd        sctp socket
452  * @param[in ]   level         选项定义的层次;支持SOL_SOCKET、IPPROTO_SCTP、IPPROTO_TCP、IPPROTO_IP和IPPROTO_IPV6。
453  * @param[in ]   optname       需获取的选项
454  * @param[out]   optval        存放获取的值
455  * @param[in ]   optlen        optval的大小
456  * @param[out]   optlen        获取的大小
457  * @return       成功返回 VOS_OK,失败则返回 其他
458 */
459 LONG vos_getsockopt(LONG sockfd, LONG level, LONG optname,void *optval, socklen_t *optlen);
460
461
462 /**
463  * 设置 socket 选项参数
464  * @param[in ]   sockfd        sctp socket
465  * @param[in ]   level         同 vos_getsockopt
466  * @param[in ]   optname       需设置的选项
467  * @param[in ]   optval        要设置的值
468  * @param[in ]   optlen        optval的大小
469  * @return       成功返回 VOS_OK,失败则返回 其他
470 */
471 LONG vos_setsockopt(LONG sockfd, LONG level, LONG optname,const void *optval, socklen_t optlen);
472
473
474 /**
475  * 关闭文件描述符
476  * @param[in ]   sockfd        socket
477  * @return       成功返回 VOS_OK,失败则返回 其他
478 */
479 LONG vos_close(LONG sockfd);
480
481
482 /**
483  * 从一对多式socket的关联标识id中抽取一个一对一式socket
484  * @param[in ]   sockfd        一对多式socket
485  * @param[in ]   assoc_id      关联标识id
486  * @return       成功返回 文件描述符,失败则返回 其他
487 */
488 LONG vos_sctp_peeloff(LONG sockfd, sctp_assoc_t assoc_id);
489
490
491 /**
492  * 获取 SCTP 相关的 socket 选项参数
493  * @param[in ]   sockfd        sctp socket
494  * @param[in ]   assoc_id      关联标识id
495  * @param[in ]   opt           SCTP 相关的 socket 选项
496  * @param[out]   arg           用于存放参数
497  * @param[out]   size          参数的大小
498  * @return       成功返回 VOS_OK,失败则返回 其他
499 */
500 LONG vos_sctp_opt_info(LONG sockfd, sctp_assoc_t assoc_id, LONG opt, void *arg, socklen_t *size);
501
502
503 /**
504  * 获取 对端的 IP 地址,使用完需要调用 vos_sctp_freepaddrs 释放资源
505  * @param[in ]   sockfd        sctp socket
506  * @param[in ]   assoc_id      关联标识id
507  * @param[out]   addrs         用于存放地址
508  * @return       成功返回 地址个数,失败则返回 VOS_ERROR
509 */
510 LONG vos_sctp_getpaddrs(LONG sockfd, sctp_assoc_t assoc_id,vos_sockaddr_t **addrs);
511
512
513 /**
514  * 释放由 vos_sctp_getpaddrs 函数分配的资源,获取到 0 个时不需要释放
515  * @param[out]   addrs         vos_sctp_getpaddrs 返回的地址
516  * @return       成功返回 VOS_OK ,失败则返回 其他
517 */
518 LONG vos_sctp_freepaddrs(vos_sockaddr_t *addrs);
519
520 /**
521  * 获取 本地的 IP 地址,使用完需要调用 vos_sctp_freepaddrs 释放资源
522  * @param[in ]   sockfd        sctp socket
523  * @param[in ]   assoc_id      关联标识id
524  * @param[out]   addrs         用于存放地址
525  * @return       成功返回 地址个数,失败则返回 VOS_ERROR
526 */
527 LONG vos_sctp_getladdrs(LONG sockfd, sctp_assoc_t assoc_id,vos_sockaddr_t **addrs);
528
529 /**
530  * 释放由 vos_sctp_getladdrs 函数分配的资源,获取到 0 个时不需要释放
531  * @param[out]   addrs         vos_sctp_getladdrs 返回的地址
532  * @return       成功返回 VOS_OK ,失败则返回 其他
533 */
534 LONG vos_sctp_freeladdrs(vos_sockaddr_t *addrs);
535
536 /**
537  * 判断字符串是否为IPv4地址
538  * @param[in ]   str        待判断字符串
539  * @return       是返回 TRUE ,否返回 FALSE
540 */
541 BOOL vos_is_ipv4_addr(CHAR *str);
542
543 /**
544  * 判断字符串是否为IPv6地址
545  * @param[in ]   str        待判断字符串
546  * @return       是返回 TRUE ,否返回 FALSE
547 */
548 BOOL vos_is_ipv6_addr(char *str);
549
550 /**
551  * 判断两个addr是否相等
552  * @param[in ]   addr1        待判断地址结构
553  * @param[in ]   addr2        待判断地址结构
554  * @param[in ]   ignPort      是否忽略端口号
555  * @return       相等则返回0,不相等返回非0
556 */
557 LONG vos_sock_addr_cmp(vos_sockaddr_t *addr1,vos_sockaddr_t *addr2,BOOL ignPort);
558
559
560 /**
561  * addr 地址结构转换成用于打印的字符串
562  * @param[in ]   addr        地址结构
563  * @param[in ]   str         用于存放生成的字符串
564  * @param[in ]   size        str大小
565  * @return       返回指向str的指针
566 */
567 CHAR *vos_addr_showstr(vos_sockaddr_t *addr,CHAR *str,LONG size);
568
569
570 /**
571  * 创建sctp 一对一 socket,包含创建、绑定和监听
572  * @param[in ]   family        VOS_AF_INET 和 VOS_AF_INET6
573  * @param[in ]   addrs         地址数组
574  * @param[in ]   addrcnt       地址个数
575  * @param[in ]   port          端口号
576  * @param[in ]   maxClient     最大连接数
577  * @param[in ]   initmsg       sctp 相关信息
578  * @param[in ]   events        sctp 事件,如果传入 NULL 则默认监听 data_io
579  * @return       成功返回 文件描述符,失败则返回 其他
580 */
581 LONG vos_sctp_server_one2one_create(vos_domain_t family,vos_sockaddr_t *addrs,LONG addrcnt, SHORT port, LONG maxClient,struct sctp_initmsg *initmsg,struct sctp_event_subscribe *events);
582
583 /**
584  * 创建sctp 一对一 socket,包含创建 和 连接
585  * @param[in ]   family        VOS_AF_INET 和 VOS_AF_INET6
586  * @param[in ]   s_addrs       地址数组
587  * @param[in ]   s_addrcnt     地址个数
588  * @param[in ]   s_port        端口号
589  * @param[in ]   initmsg       sctp 相关信息
590  * @param[in ]   events        sctp 事件,如果传入 NULL 则默认监听 data_io
591  * @param[out]   id            sctp_assoc id
592  * @return       成功返回 文件描述符,失败则返回 其他
593 */
594 LONG vos_sctp_client_one2one_create(vos_domain_t family,vos_sockaddr_t *s_addrs,LONG s_addrcnt, SHORT s_port,
595                                                     struct sctp_initmsg *initmsg,struct sctp_event_subscribe *events,sctp_assoc_t *id);
596
597
598 /**
599  * 通过字符串地址创建sctp 一对一 socket,包含创建 和 连接
600  * @param[in ]   family        VOS_AF_INET 和 VOS_AF_INET6
601  * @param[in ]   s_addrStr     地址数组
602  * @param[in ]   s_addrcnt     地址个数
603  * @param[in ]   s_port        端口号
604  * @param[in ]   initmsg       sctp 相关信息
605  * @param[in ]   events        sctp 事件,如果传入 NULL 则默认监听 data_io
606  * @param[out]   id            sctp_assoc id
607  * @return       成功返回 文件描述符,失败则返回 其他
608 */
609 LONG vos_sctp_client_one2one_str_create(vos_domain_t family,CHAR *s_addrStr[],LONG s_addrcnt, SHORT s_port,
610                                                     struct sctp_initmsg *initmsg,struct sctp_event_subscribe *events,sctp_assoc_t *id);
611
612
613 /**
614  * 创建sctp 一对一 socket,包含创建、绑定和监听
615  * @param[in ]   family        VOS_AF_INET 和 VOS_AF_INET6
616  * @param[in ]   addrStr       地址字符串数组
617  * @param[in ]   addrcnt       地址个数
618  * @param[in ]   port          端口号
619  * @param[in ]   maxClient     最大连接数
620  * @param[in ]   initmsg       sctp 相关信息
621  * @param[in ]   events        sctp 事件,如果传入 NULL 则默认监听 data_io
622  * @return       成功返回 文件描述符,失败则返回 其他
623 */
624 LONG vos_sctp_server_one2one_str_create(vos_domain_t family,CHAR *addrStr[],LONG addrcnt, SHORT port, LONG maxClient,struct sctp_initmsg *initmsg,struct sctp_event_subscribe *events);
625
626
627 /**
628  * 创建sctp 一对多 socket,包含创建、绑定和监听
629  * @param[in ]   family        VOS_AF_INET 和 VOS_AF_INET6
630  * @param[in ]   addrs         地址数组
631  * @param[in ]   addrcnt       地址个数
632  * @param[in ]   port          端口号
633  * @param[in ]   maxClient     最大连接数
634  * @param[in ]   initmsg       sctp 相关信息
635  * @param[in ]   events        sctp 事件,如果传入 NULL 则默认监听 data_io
636  * @return       成功返回 文件描述符,失败则返回 其他
637 */
638 LONG vos_sctp_server_one2many_create(vos_domain_t family,vos_sockaddr_t *addrs,LONG addrcnt, SHORT port, LONG maxClient,struct sctp_initmsg *initmsg,struct sctp_event_subscribe *events);
639
640 /**
641  * 创建sctp 一对多 socket,包含创建
642  * @param[in ]   family        VOS_AF_INET 和 VOS_AF_INET6
643  * @param[in ]   s_addrs       地址数组
644  * @param[in ]   s_addrcnt     地址个数
645  * @param[in ]   s_port        端口号
646  * @param[in ]   initmsg       sctp 相关信息
647  * @param[in ]   events        sctp 事件,如果传入 NULL 则默认监听 data_io
648  * @return       成功返回 文件描述符,失败则返回 其他
649 */
650 LONG vos_sctp_client_one2many_create(vos_domain_t family,vos_sockaddr_t *s_addrs,LONG s_addrcnt, SHORT s_port,
651                                                struct sctp_initmsg *initmsg,struct sctp_event_subscribe *events);
652
653 /**
654  * 创建sctp 一对多 socket,包含创建、绑定和监听
655  * @param[in ]   family        VOS_AF_INET 和 VOS_AF_INET6
656  * @param[in ]   addrStr       地址字符串数组
657  * @param[in ]   addrcnt       地址个数
658  * @param[in ]   port          端口号
659  * @param[in ]   maxClient     最大连接数
660  * @param[in ]   initmsg       sctp 相关信息
661  * @param[in ]   events        sctp 事件,如果传入 NULL 则默认监听 data_io
662  * @return       成功返回 文件描述符,失败则返回 其他
663 */
664 LONG vos_sctp_server_one2many_str_create(vos_domain_t family,CHAR *addrStr[],LONG addrcnt, SHORT port, LONG maxClient,struct sctp_initmsg *initmsg,struct sctp_event_subscribe *events);
665
666 /**
667  * 通过字符串地址创建sctp 一对多 socket,包含创建
668  * @param[in ]   family        VOS_AF_INET 和 VOS_AF_INET6
669  * @param[in ]   s_addrStr     地址数组
670  * @param[in ]   s_addrcnt     地址个数
671  * @param[in ]   s_port        端口号
672  * @param[in ]   initmsg       sctp 相关信息
673  * @param[in ]   events        sctp 事件,如果传入 NULL 则默认监听 data_io
674  * @return       成功返回 文件描述符,失败则返回 其他
675 */
676 LONG vos_sctp_client_one2many_str_create(vos_domain_t family,CHAR *s_addrStr[],LONG s_addrcnt, SHORT s_port,
677                                                      struct sctp_initmsg *initmsg,struct sctp_event_subscribe *events);
678
679
680 LONG vos_udp_client_socket_create_bind(vos_domain_t family,const CHAR *s_addrStr,SHORT s_port,vos_sockaddr_t *s_addr,vos_sockaddr_t *my_addr);
681
682 LONG vos_tcp_client_socket_create_bind(vos_domain_t family,const CHAR *addrStr,SHORT port,vos_sockaddr_t *my_addr);
683
684 LONG vos_sctp_client_one2one_create_bind(vos_domain_t family,vos_sockaddr_t *s_addrs,LONG s_addrcnt, SHORT s_port,
685                                                     struct sctp_initmsg *initmsg,struct sctp_event_subscribe *events,sctp_assoc_t *id,
686                                                     vos_sockaddr_t *my_addrs,LONG my_addrcnt);
687
688 LONG vos_sctp_client_one2many_create_bind(vos_domain_t family,vos_sockaddr_t *s_addrs,LONG s_addrcnt, SHORT s_port,
689                                                struct sctp_initmsg *initmsg,struct sctp_event_subscribe *events,
690                                                vos_sockaddr_t *my_addrs,LONG my_addrcnt);
691
692
693 #ifdef  __cplusplus
694 }
695 #endif  /* end of __cplusplus */
696
697 #endif  /* end of __VOS_SOCKET_H__ */