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