• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  * Description: 系统适配层网络Socket接口(此文件为DEMO,需集成方适配修改)
15  */
16 #ifndef HILINK_SOCKET_ADAPTER_H
17 #define HILINK_SOCKET_ADAPTER_H
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 typedef enum HiLinkSocketDomain {
24     HILINK_SOCKET_DOMAIN_AF_INET = 0,
25     HILINK_SOCKET_DOMAIN_AF_INET6,
26     HILINK_SOCKET_DOMAIN_UNSPEC,
27     /* 避免编译器优化,限制该枚举值为32-bit */
28     HILINK_SOCKET_DOMAIN_RESERVED = 0x7FFFFFFF
29 } HiLinkSocketDomain;
30 
31 typedef enum HiLinkSocketType {
32     HILINK_SOCKET_TYPE_STREAM = 0,
33     HILINK_SOCKET_TYPE_DGRAM,
34     HILINK_SOCKET_TYPE_RAW,
35     /* 避免编译器优化,限制该枚举值为32-bit */
36     HILINK_SOCKET_TYPE_RESERVED = 0x7FFFFFFF
37 } HiLinkSocketType;
38 
39 typedef enum HiLinkSocketProto {
40     HILINK_SOCKET_PROTO_IP = 0,
41     HILINK_SOCKET_PROTO_TCP,
42     HILINK_SOCKET_PROTO_UDP,
43     /* 避免编译器优化,限制该枚举值为32-bit */
44     HILINK_SOCKET_PROTO_RESERVED = 0x7FFFFFFF
45 } HiLinkSocketProto;
46 
47 typedef enum HiLinkSocketOption {
48     /* 将套接字设置为阻塞模式 */
49     HILINK_SOCKET_OPTION_SETFL_BLOCK = 0,
50     /* 将套接字设置为非阻塞模式 */
51     HILINK_SOCKET_OPTION_SETFL_NONBLOCK,
52     /* 设置套接字读取超时时间,附带参数类型为unsigned int *,单位为ms */
53     HILINK_SOCKET_OPTION_READ_TIMEOUT,
54     /* 设置套接字发送超时时间,附带参数类型为unsigned int *,单位为ms */
55     HILINK_SOCKET_OPTION_SEND_TIMEOUT,
56     /* 允许套接字重复绑定地址 */
57     HILINK_SOCKET_OPTION_ENABLE_REUSEADDR,
58     /* 禁用套接字重复绑定地址 */
59     HILINK_SOCKET_OPTION_DISABLE_REUSEADDR,
60     /* 设置套接字加入组播组,附带参数类型为const char *,为组播点分ip地址字符串 */
61     HILINK_SOCKET_OPTION_ADD_MULTI_GROUP,
62     /* 设置套接字退出组播组,附带参数类型为const char *,为组播点分ip地址字符串 */
63     HILINK_SOCKET_OPTION_DROP_MULTI_GROUP,
64     /* 允许套接字发送广播 */
65     HILINK_SOCKET_OPTION_ENABLE_BROADCAST,
66     /* 禁用套接字发送广播 */
67     HILINK_SOCKET_OPTION_DISABLE_BROADCAST,
68     /* 允许套接字接收组播数据回环 */
69     HILINK_SOCKET_OPTION_ENABLE_MULTI_LOOP,
70     /* 禁用套接字接收组播数据回环 */
71     HILINK_SOCKET_OPTION_DISABLE_MULTI_LOOP,
72     /* 设置套接字发送缓冲区大小,附带参数类型为(unsigned int *) */
73     HILINK_SOCKET_OPTION_SEND_BUFFER,
74     /* 设置套接字读取缓冲区大小,附带参数类型为(unsigned int *) */
75     HILINK_SOCKET_OPTION_READ_BUFFER,
76     /* 避免编译器优化,限制该枚举值为32-bit */
77     HILINK_SOCKET_OPTION_RESERVED = 0x7FFFFFFF
78 } HiLinkSocketOption;
79 
80 typedef struct HiLinkSockaddr {
81     unsigned short saFamily;
82 #define HILINK_SA_DATA_LEN     14
83     char saData[HILINK_SA_DATA_LEN];
84 } HiLinkSockaddr;
85 
86 typedef struct HiLinkSockaddrIn {
87     unsigned short sinFamily;
88     unsigned short sinPort;
89     unsigned int sinAddr;
90 #define HILINK_SIN_ZERO_LEN    8
91     char sinZero[HILINK_SIN_ZERO_LEN];
92 } HiLinkSockaddrIn;
93 
94 typedef struct HiLinkAddrInfo HiLinkAddrInfo;
95 
96 struct HiLinkAddrInfo {
97     int aiFlags;
98     int aiFamily;
99     int aiSocktype;
100     int aiProtocol;
101     int aiAddrlen;
102     HiLinkSockaddr *aiAddr;
103     char *aiCanonname;
104     HiLinkAddrInfo *aiNext;
105 };
106 
107 typedef struct HiLinkFdSet {
108     unsigned int num;
109     int *fdSet;
110 } HiLinkFdSet;
111 
112 enum HiLinkSocketErrno {
113     HILINK_SOCKET_ERRNO_NO_ERROR    = 0,
114     HILINK_SOCKET_ERRNO_EINTR       = 4,
115     HILINK_SOCKET_ERRNO_EAGAIN      = 11,
116     HILINK_SOCKET_ERRNO_EWOULDBLOCK = HILINK_SOCKET_ERRNO_EAGAIN,
117     HILINK_SOCKET_ERRNO_EINPROGRESS = 115,
118 };
119 
120 /*
121  * 功能: 将主机名转换为地址信息
122  * 参数: nodename,主机名
123  *       servname,服务名
124  *       hints,指定参数
125  *       result,出参,地址信息链表
126  * 返回: 0,获取成功
127  *       其他,获取失败
128  */
129 int HILINK_GetAddrInfo(const char *nodename, const char *servname,
130     const HiLinkAddrInfo *hints, HiLinkAddrInfo **result);
131 
132 /*
133  * 功能: 释放HILINK_GetAddrInfo获取的地址信息链表
134  * 参数: addrInfo,地址信息链表
135  */
136 void HILINK_FreeAddrInfo(HiLinkAddrInfo *addrInfo);
137 
138 /*
139  * 功能: 获取获取INET网络套接字文件描述符
140  * 参数: type,指定协议类型
141  * 返回: 大于等于0,返回套接字描述符
142  *       小于0,获取失败
143  */
144 int HILINK_Socket(HiLinkSocketDomain domain, HiLinkSocketType type, HiLinkSocketProto proto);
145 
146 /*
147  * 功能: 关闭套接字
148  * 参数: fd,指定套接字
149  */
150 void HILINK_Close(int fd);
151 
152 /*
153  * 功能: 设置套接字可选字段
154  * 参数: fd,指定套接字
155  *       option,设定的选项
156  *       value,选项参数
157  *       len,选项参数长度
158  * 返回: 0,设置成功
159  *       -1,设置失败
160  */
161 int HILINK_SetSocketOpt(int fd, HiLinkSocketOption option, const void *value, unsigned int len);
162 
163 /*
164  * 功能: 绑定套接字
165  * 参数: fd,指定的套接字
166  *       addr,指向包含要绑定到套接字的地址
167  *       addrLen,套接字地址大小,当前不使用,为ipv6预留
168  * 返回: 0,绑定成功
169  *       -1,绑定失败
170  */
171 int HILINK_Bind(int fd, const HiLinkSockaddr *addr, unsigned int addrLen);
172 
173 /*
174  * 功能: 连接对端IP地址
175  * 参数: fd,指定的套接字文件描述符
176  *       addr,指向套接字连接的地址
177  * 返回: 0,设置成功
178  *       其他,设置失败
179  */
180 int HILINK_Connect(int fd, const HiLinkSockaddr *addr, unsigned int addrLen);
181 
182 /*
183  * 功能: 从已经连接的套接字接收消息
184  * 参数: fd,指定的套接字
185  *       buf,接收数据缓冲区
186  *       len,缓冲区长度
187  * 返回: 大于等于0,实际接收的字节数
188  *       小于0,读取出错,返回错误码
189  */
190 int HILINK_Recv(int fd, unsigned char *buf, unsigned int len);
191 
192 /*
193  * 功能: 传输指定长度消息到对端
194  * 参数: fd,指定的套接字
195  *       buf,要发送的数据
196  *       len,数据长度
197  * 返回: 大于等于0,实际发送的字节数
198  *       小于0,发送失败,返回错误码
199  */
200 int HILINK_Send(int fd, const unsigned char *buf, unsigned int len);
201 
202 /*
203  * 功能: 从套接字接收消息,并返回源地址
204  * 参数: fd,指定的套接字
205  *       buf,接收数据缓冲区
206  *       len,缓冲区长度
207  *       from,出参,数据源地址
208  * 返回: 大于等于0,实际接收的字节数
209  *       小于0,接收出错,返回错误码
210  */
211 int HILINK_RecvFrom(int fd, unsigned char *buf, unsigned int len, HiLinkSockaddr *from, unsigned int *fromLen);
212 
213 /*
214  * 功能: 发送数据到指定地址
215  * 参数: fd,指定的套接字
216  *       buf,要发送的数据
217  *       len,数据长度
218  *       to,目标地址信息
219  * 返回: 大于0,实际发送的字节数
220  *       小于等于0,发送失败,返回错误码
221  */
222 int HILINK_SendTo(int fd, const unsigned char *buf, unsigned int len, const HiLinkSockaddr *to, unsigned int toLen);
223 
224 /*
225  * 功能: 检视多个文件描述符
226  * 参数: rs,待检查是否准备好读取的描述符集合
227  *       ws,待检查是否准备好写入的描述符集合
228  *       es,待检查挂起错误条件的描述符集合
229  *       ms,超时时间,为HILINK_WAIT_FOREVER时不会超时
230  * 返回: 大于0,与条件相符的描述符数量
231  *       等于0,超时
232  *       小于0,套接字出错,返回错误码
233  * 注意: 返回时需将不符合要求的描述符置为-1
234  */
235 int HILINK_Select(HiLinkFdSet *readSet, HiLinkFdSet *writeSet, HiLinkFdSet *exceptSet, unsigned int ms);
236 
237 /*
238  * 功能: 获取描述符错误码
239  * 参数: fd,指定的套接字,小于0时返回系统errno
240  * 返回: 错误码,参考HiLinkSocketErrno
241  * 注意:在HiLinkSocketErrno定义范围内的错误码需严格按照定义返回
242  */
243 int HILINK_GetSocketErrno(int fd);
244 
245 int get_os_errno(void);
246 
247 /*
248  * 功能: 获取全局错误码
249  * 返回: 全局错误码错误码
250  */
251 typedef int (*GetErrno)(void);
252 
253 /*
254  * 功能: 注册获取全局错误码回调函数,不注册默认使用errno
255  * 参数: cb,获取全局错误码回调函数
256  * 返回: 0表示成功,其他表示失败
257  */
258 int HILINK_RegisterErrnoCallback(GetErrno cb);
259 
260 /*
261  * 功能: 将32位的主机序转为网络序
262  * 参数: hl,32位主机序
263  * 返回: 32位网络序
264  */
265 unsigned int HILINK_Htonl(unsigned int hl);
266 
267 /*
268  * 功能: 将32位的网络序转为主机序
269  * 参数: netlong,32位网络序
270  * 返回: 32位主机序
271  */
272 unsigned int HILINK_Ntohl(unsigned int nl);
273 
274 /*
275  * 功能: 将16位的主机序转为网络序
276  * 参数: hostlong,16位主机序
277  * 返回: 16位网络序
278  */
279 unsigned short HILINK_Htons(unsigned short hs);
280 
281 /*
282  * 功能: 将16位的网络序转为主机序
283  * 参数: netlong,16位网络序
284  * 返回: 16位主机序
285  */
286 unsigned short HILINK_Ntohs(unsigned short ns);
287 
288 /*
289  * 功能: 将点分ip地址字符串转为32位网络序地址
290  * 参数: ip,点分ip地址字符串
291  *       addr,出参,32位网络序地址
292  * 返回: 0,转换失败
293  *       非0,转换成功
294  */
295 unsigned int HILINK_InetAton(const char *ip, unsigned int *addr);
296 
297 /*
298  * 功能: 将点分ip地址字符串转为32位网络序地址
299  * 参数: ip,点分ip地址字符串
300  * 返回: 0xFFFFFFFF,转换失败
301  *       其他,转换成功
302  * 注意: 需要正确转换255.255.255.255请使用HILINK_InetAton
303  */
304 unsigned int HILINK_InetAddr(const char *ip);
305 
306 /*
307  * 功能: 将32位网络序地址转为点分ip地址字符串
308  * 参数: addr,32位网络序地址
309  * 返回: NULL,转换失败
310  *       非NULL,转换成功
311  */
312 const char *HILINK_InetNtoa(unsigned int addr, char *buf, unsigned int buflen);
313 
314 #ifdef __cplusplus
315 }
316 #endif
317 
318 #endif /* HILINK_SOCKET_ADAPTER_H */
319