iot_socket.h 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677
  1. #ifndef __IOT_SOCKET_H__
  2. #define __IOT_SOCKET_H__
  3. #include "am_openat.h"
  4. #include <sys/_timeval.h>
  5. #define OPENAT_INADDR_NONE (0xFFFFFFFF)
  6. #define INVALID_SOCKET (0xFFFFFFFFL)
  7. #define SOCKET_ERROR (0xFFFFFFFFL)
  8. /* Flags we can use with send and recv. */
  9. #define MSG_PEEK 0x01 /* Peeks at an incoming message */
  10. #define MSG_WAITALL 0x02 /* Unimplemented: Requests that the function block until the full amount of data requested can be returned */
  11. #define MSG_OOB 0x04 /* Unimplemented: Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific */
  12. #define MSG_DONTWAIT 0x08 /* Nonblocking i/o for this operation only */
  13. #define MSG_MORE 0x10 /* Sender will send more */
  14. #define MSG_NOSIGNAL 0x20 /* Uninmplemented: Requests not to send the SIGPIPE signal if an attempt to send is made on a stream-oriented socket that is no longer connected. */
  15. struct openat_sockaddr
  16. {
  17. uint8 sa_len; /* total length */
  18. uint8 sa_family; /* address family */
  19. uint8 sa_data[14];
  20. };
  21. struct openat_ip_addr {
  22. uint32 addr;
  23. };
  24. struct openat_in_address{
  25. uint32 s_addr;
  26. };
  27. /* members are in network byte order */
  28. struct openat_sockaddr_in {
  29. uint8 sin_len;
  30. uint8 sin_family;
  31. uint16 sin_port;
  32. struct openat_in_address sin_addr;
  33. #define SIN_ZERO_LEN 8
  34. char sin_zero[SIN_ZERO_LEN];
  35. };
  36. typedef struct openat_ip_addr openat_ip_addr_t;
  37. struct openat_hostent {
  38. char *h_name; /* Official name of the host. */
  39. char **h_aliases; /* A pointer to an array of pointers to alternative host names,
  40. terminated by a null pointer. */
  41. int h_addrtype; /* Address type. */
  42. int h_length; /* The length, in bytes, of the address. */
  43. char **h_addr_list; /* A pointer to an array of pointers to network addresses (in
  44. network byte order) for the host, terminated by a null pointer. */
  45. #define h_addr h_addr_list[0] /* for backward compatibility */
  46. };
  47. typedef uint32 openat_socklen_t;
  48. struct openat_addrinfo {
  49. int ai_flags; /* Input flags. */
  50. int ai_family; /* Address family of socket. */
  51. int ai_socktype; /* Socket type. */
  52. int ai_protocol; /* Protocol of socket. */
  53. openat_socklen_t ai_addrlen; /* Length of socket address. */
  54. struct openat_sockaddr *ai_addr; /* Socket address of socket. */
  55. char *ai_canonname; /* Canonical name of service location. */
  56. struct openat_addrinfo *ai_next; /* Pointer to next in list. */
  57. };
  58. #ifndef FD_SET
  59. #undef FD_SETSIZE
  60. #define MEMP_NUM_NETCONN 8
  61. #define LWIP_SOCKET_OFFSET 1
  62. /* Make FD_SETSIZE match NUM_SOCKETS in socket.c */
  63. #define FD_SETSIZE MEMP_NUM_NETCONN
  64. #define FDSETSAFESET(n, code) do { \
  65. if (((n) - LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n) - LWIP_SOCKET_OFFSET) >= 0)) { \
  66. code; }} while(0)
  67. #define FDSETSAFEGET(n, code) (((n) - LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n) - LWIP_SOCKET_OFFSET) >= 0) ?\
  68. (code) : 0)
  69. #define FD_SET(n, p) FDSETSAFESET(n, (p)->fds_bits[((n)-LWIP_SOCKET_OFFSET)/8] |= (1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))
  70. #define FD_CLR(n, p) FDSETSAFESET(n, (p)->fds_bits[((n)-LWIP_SOCKET_OFFSET)/8] &= ~(1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))
  71. #define FD_ISSET(n,p) FDSETSAFEGET(n, (p)->fds_bits[((n)-LWIP_SOCKET_OFFSET)/8] & (1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))
  72. #define FD_ZERO(p) memset((void*)(p), 0, sizeof(*(p)))
  73. typedef struct fd_set
  74. {
  75. unsigned char fds_bits [(FD_SETSIZE+7)/8];
  76. } fd_set;
  77. #elif LWIP_SOCKET_OFFSET
  78. #error LWIP_SOCKET_OFFSET does not work with external FD_SET!
  79. #elif FD_SETSIZE < MEMP_NUM_NETCONN
  80. #error "external FD_SETSIZE too small for number of sockets"
  81. #endif /* FD_SET */
  82. #if 0
  83. struct timeval
  84. {
  85. long long tv_sec;
  86. int tv_usec;
  87. };
  88. #endif
  89. /** This is the aligned version of ip6_addr_t,
  90. used as local variable, on the stack, etc. */
  91. struct ip6_addr {
  92. uint32 addr[4];
  93. uint8 zone;
  94. };
  95. /** IPv6 address */
  96. typedef struct ip6_addr ip6_addr_t;
  97. /** This is the aligned version of ip4_addr_t,
  98. used as local variable, on the stack, etc. */
  99. struct ip4_addr {
  100. uint32 addr;
  101. };
  102. /** ip4_addr_t uses a struct for convenience only, so that the same defines can
  103. * operate both on ip4_addr_t as well as on ip4_addr_p_t. */
  104. typedef struct ip4_addr ip4_addr_t;
  105. #define sockaddr_in openat_sockaddr_in
  106. #define hostent openat_hostent
  107. #define sockaddr openat_sockaddr
  108. #define in_addr openat_in_address
  109. #define socklen_t openat_socklen_t
  110. #define addrinfo openat_addrinfo
  111. #define OPENAT_FD_SET(n, p) FD_SET(n, p)
  112. #define OPENAT_FD_CLR(n, p) FD_CLR(n, p)
  113. #define OPENAT_FD_ISSET(n,p) FD_ISSET(n,p)
  114. #define OPENAT_FD_ZERO(p) FD_ZERO(p)
  115. #define openat_fd_set fd_set
  116. #define openat_timeval timeval
  117. #define OPENAT_AF_UNSPEC 0
  118. #define OPENAT_AF_INET 2
  119. #define OPENAT_AI_PASSIVE 0x01
  120. #define OPENAT_AI_CANONNAME 0x02
  121. #define OPENAT_AI_NUMERICHOST 0x04
  122. #define OPENAT_AI_NUMERICSERV 0x08
  123. #define OPENAT_AI_V4MAPPED 0x10
  124. #define OPENAT_AI_ALL 0x20
  125. #define OPENAT_AI_ADDRCONFIG 0x40
  126. #define PF_INET OPENAT_AF_INET
  127. #define OPENAT_AF_INET6 10
  128. #define AF_INET 2
  129. #define AF_INET6 10
  130. /* Socket protocol types (TCP/UDP/RAW) */
  131. #define OPENAT_SOCK_STREAM 1
  132. #define OPENAT_SOCK_DGRAM 2
  133. #define OPENAT_SOCK_RAW 3
  134. #define SO_REUSEADDR 0x0004
  135. #define SO_KEEPALIVE 0x0008
  136. #define SO_BROADCAST 0x0020
  137. #define SOL_SOCKET 0xfff
  138. #define SO_DEBUG 0x0001 /* Unimplemented: turn on debugging info recording */
  139. #define SO_ACCEPTCONN 0x0002 /* socket has had listen() */
  140. #define SO_DONTROUTE 0x0010 /* Unimplemented: just use interface addresses */
  141. #define SO_USELOOPBACK 0x0040 /* Unimplemented: bypass hardware when possible */
  142. #define SO_LINGER 0x0080 /* linger on close if data present */
  143. #define SO_DONTLINGER ((int)(~SO_LINGER))
  144. #define SO_OOBINLINE 0x0100 /* Unimplemented: leave received OOB data in line */
  145. #define SO_REUSEPORT 0x0200 /* Unimplemented: allow local address & port reuse */
  146. #define SO_SNDBUF 0x1001 /* Unimplemented: send buffer size */
  147. #define SO_RCVBUF 0x1002 /* receive buffer size */
  148. #define SO_SNDLOWAT 0x1003 /* Unimplemented: send low-water mark */
  149. #define SO_RCVLOWAT 0x1004 /* Unimplemented: receive low-water mark */
  150. #define SO_SNDTIMEO 0x1005 /* send timeout */
  151. #define SO_RCVTIMEO 0x1006 /* receive timeout */
  152. #define SO_ERROR 0x1007 /* get error status and clear */
  153. #define SO_TYPE 0x1008 /* get socket type */
  154. #define SO_CONTIMEO 0x1009 /* Unimplemented: connect timeout */
  155. #define SO_NO_CHECK 0x100a /* don't create UDP checksum */
  156. #define SO_BINDTODEVICE 0x100b /* bind to device */
  157. /*
  158. * Options for level IPPROTO_TCP
  159. */
  160. #define OPENAT_TCP_NODELAY 0x01 /* don't delay send to coalesce packets */
  161. #define OPENAT_TCP_KEEPALIVE 0x02 /* send KEEPALIVE probes when idle for pcb->keep_idle milliseconds */
  162. #define OPENAT_TCP_KEEPIDLE 0x03 /* set pcb->keep_idle - Same as TCP_KEEPALIVE, but use seconds for get/setsockopt */
  163. #define OPENAT_TCP_KEEPINTVL 0x04 /* set pcb->keep_intvl - Use seconds for get/setsockopt */
  164. #define OPENAT_TCP_KEEPCNT 0x05 /* set pcb->keep_cnt - Use number of probes sent for get/setsockopt */
  165. #define OPENAT_TCP_TIMEROUT 0x06 /* set pcb->keep_cnt - Use number of probes sent for get/setsockopt */
  166. #define OPENAT_TCP_MSS_VALUE 0x07 /* set pcb->mss - Use number of probes only for get/setsockopt */
  167. #define OPENAT_TCP_RTO_VALUE 0x08 /* set pcb->rto - Use number of probes only for get/setsockopt */
  168. #define OPENAT_TCP_TXB_UNACK 0x09 /* set (pcb->snd_lbb - pcb->lastack) - how much byte remaind in buffer for unacked */
  169. #define OPENAT_TCP_TXB_REST 0x0A /* set (pcb->snd_buf) - how much byte remaind in tx buffer can writen by app */
  170. #define OPENAT_TCP_TXB_ACKED 0x0B /* set (pcb->acked_sum) - the number of accumulation of acked */
  171. #define OPENAT_ERROK 0 /* err ok set, no err happen */
  172. #define OPENAT_EPERM 1 /* Operation not permitted */
  173. #define OPENAT_ENOENT 2 /* No such file or directory */
  174. #define OPENAT_ESRCH 3 /* No such process */
  175. #define OPENAT_EINTR 4 /* Interrupted system call */
  176. #define OPENAT_EIO 5 /* I/O error */
  177. #define OPENAT_ENXIO 6 /* No such device or address */
  178. #define OPENAT_E2BIG 7 /* Arg list too long */
  179. #define OPENAT_ENOEXEC 8 /* Exec format error */
  180. #define OPENAT_EBADF 9 /* Bad file number */
  181. #define OPENAT_ECHILD 10 /* No child processes */
  182. #define OPENAT_EAGAIN 11 /* Try again */
  183. #define OPENAT_ENOMEM 12 /* Out of memory */
  184. #define OPENAT_EACCES 13 /* Permission denied */
  185. #define OPENAT_EFAULT 14 /* Bad address */
  186. #define OPENAT_ENOTBLK 15 /* Block device required */
  187. #define OPENAT_EBUSY 16 /* Device or resource busy */
  188. #define OPENAT_EEXIST 17 /* File exists */
  189. #define OPENAT_EXDEV 18 /* Cross-device link */
  190. #define OPENAT_ENODEV 19 /* No such device */
  191. #define OPENAT_ENOTDIR 20 /* Not a directory */
  192. #define OPENAT_EISDIR 21 /* Is a directory */
  193. #define OPENAT_EINVAL 22 /* Invalid argument */
  194. #define OPENAT_ENFILE 23 /* File table overflow */
  195. #define OPENAT_EMFILE 24 /* Too many open files */
  196. #define OPENAT_ENOTTY 25 /* Not a typewriter */
  197. #define OPENAT_ETXTBSY 26 /* Text file busy */
  198. #define OPENAT_EFBIG 27 /* File too large */
  199. #define OPENAT_ENOSPC 28 /* No space left on device */
  200. #define OPENAT_ESPIPE 29 /* Illegal seek */
  201. #define OPENAT_EROFS 30 /* Read-only file system */
  202. #define OPENAT_EMLINK 31 /* Too many links */
  203. #define OPENAT_EPIPE 32 /* Broken pipe */
  204. #define OPENAT_LWIPEDOM 33 /* Math argument out of domain of func */
  205. #define OPENAT_LWIPERANGE 34 /* Math result not representable */
  206. #define OPENAT_EDEADLK 35 /* Resource deadlock would occur */
  207. #define OPENAT_ENAMETOOLONG 36 /* File name too long */
  208. #define OPENAT_ENOLCK 37 /* No record locks available */
  209. #define OPENAT_ENOSYS 38 /* Function not implemented */
  210. #define OPENAT_ENOTEMPTY 39 /* Directory not empty */
  211. #define OPENAT_ELOOP 40 /* Too many symbolic links encountered */
  212. #define OPENAT_EWOULDBLOCK OPENAT_EAGAIN /* Operation would block */
  213. #define OPENAT_ENOMSG 42 /* No message of desired type */
  214. #define OPENAT_EIDRM 43 /* Identifier removed */
  215. #define OPENAT_ECHRNG 44 /* Channel number out of range */
  216. #define OPENAT_EL2NSYNC 45 /* Level 2 not synchronized */
  217. #define OPENAT_EL3HLT 46 /* Level 3 halted */
  218. #define OPENAT_EL3RST 47 /* Level 3 reset */
  219. #define OPENAT_ELNRNG 48 /* Link number out of range */
  220. #define OPENAT_EUNATCH 49 /* Protocol driver not attached */
  221. #define OPENAT_ENOCSI 50 /* No CSI structure available */
  222. #define OPENAT_EL2HLT 51 /* Level 2 halted */
  223. #define OPENAT_EBADE 52 /* Invalid exchange */
  224. #define OPENAT_EBADR 53 /* Invalid request descriptor */
  225. #define OPENAT_EXFULL 54 /* Exchange full */
  226. #define OPENAT_ENOANO 55 /* No anode */
  227. #define OPENAT_EBADRQC 56 /* Invalid request code */
  228. #define OPENAT_EBADSLT 57 /* Invalid slot */
  229. #define OPENAT_EDEADLOCK OPENAT_EDEADLK
  230. #define OPENAT_EBFONT 59 /* Bad font file format */
  231. #define OPENAT_ENOSTR 60 /* Device not a stream */
  232. #define OPENAT_ENODATA 61 /* No data available */
  233. #define OPENAT_ETIME 62 /* Timer expired */
  234. #define OPENAT_ENOSR 63 /* Out of streams resources */
  235. #define OPENAT_ENONET 64 /* Machine is not on the network */
  236. #define OPENAT_ENOPKG 65 /* Package not installed */
  237. #define OPENAT_EREMOTE 66 /* Object is remote */
  238. #define OPENAT_ENOLINK 67 /* Link has been severed */
  239. #define OPENAT_EADV 68 /* Advertise error */
  240. #define OPENAT_ESRMNT 69 /* Srmount error */
  241. #define OPENAT_ECOMM 70 /* Communication error on send */
  242. #define OPENAT_EPROTO 71 /* Protocol error */
  243. #define OPENAT_EMULTIHOP 72 /* Multihop attempted */
  244. #define OPENAT_EDOTDOT 73 /* RFS specific error */
  245. #define OPENAT_EBADMSG 74 /* Not a data message */
  246. #define OPENAT_EOVERFLOW 75 /* Value too large for defined data type */
  247. #define OPENAT_ENOTUNIQ 76 /* Name not unique on network */
  248. #define OPENAT_EBADFD 77 /* File descriptor in bad state */
  249. #define OPENAT_EREMCHG 78 /* Remote address changed */
  250. #define OPENAT_ELIBACC 79 /* Can not access a needed shared library */
  251. #define OPENAT_ELIBBAD 80 /* Accessing a corrupted shared library */
  252. #define OPENAT_ELIBSCN 81 /* .lib section in a.out corrupted */
  253. #define OPENAT_ELIBMAX 82 /* Attempting to link in too many shared libraries */
  254. #define OPENAT_ELIBEXEC 83 /* Cannot exec a shared library directly */
  255. #define OPENAT_LWIPEILSEQ 84 /* Illegal byte sequence */
  256. #define OPENAT_ERESTART 85 /* Interrupted system call should be restarted */
  257. #define OPENAT_ESTRPIPE 86 /* Streams pipe error */
  258. #define OPENAT_EUSERS 87 /* Too many users */
  259. #define OPENAT_ENOTSOCK 88 /* Socket operation on non-socket */
  260. #define OPENAT_EDESTADDRREQ 89 /* Destination address required */
  261. #define OPENAT_EMSGSIZE 90 /* Message too long */
  262. #define OPENAT_EPROTOTYPE 91 /* Protocol wrong type for socket */
  263. #define OPENAT_ENOPROTOOPT 92 /* Protocol not available */
  264. #define OPENAT_EPROTONOSUPPORT 93 /* Protocol not supported */
  265. #define OPENAT_ESOCKTNOSUPPORT 94 /* Socket type not supported */
  266. #define OPENAT_EOPNOTSUPP 95 /* Operation not supported on transport endpoint */
  267. #define OPENAT_EPFNOSUPPORT 96 /* Protocol family not supported */
  268. #define OPENAT_EAFNOSUPPORT 97 /* Address family not supported by protocol */
  269. #define OPENAT_EADDRINUSE 98 /* Address already in use */
  270. #define OPENAT_EADDRNOTAVAIL 99 /* Cannot assign requested address */
  271. #define OPENAT_ENETDOWN 100 /* Network is down */
  272. #define OPENAT_ENETUNREACH 101 /* Network is unreachable */
  273. #define OPENAT_ENETRESET 102 /* Network dropped connection because of reset */
  274. #define OPENAT_ECONNABORTED 103 /* Software caused connection abort */
  275. #define OPENAT_ECONNRESET 104 /* Connection reset by peer */
  276. #define OPENAT_ENOBUFS 105 /* No buffer space available */
  277. #define OPENAT_EISCONN 106 /* Transport endpoint is already connected */
  278. #define OPENAT_ENOTCONN 107 /* Transport endpoint is not connected */
  279. #define OPENAT_ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */
  280. #define OPENAT_ETOOMANYREFS 109 /* Too many references: cannot splice */
  281. #define OPENAT_ETIMEDOUT 110 /* Connection timed out */
  282. #define OPENAT_ECONNREFUSED 111 /* Connection refused */
  283. #define OPENAT_EHOSTDOWN 112 /* Host is down */
  284. #define OPENAT_EHOSTUNREACH 113 /* No route to host */
  285. #define OPENAT_EALREADY 114 /* Operation already in progress */
  286. #define OPENAT_EINPROGRESS 115 /* Operation now in progress */
  287. #define OPENAT_ESTALE 116 /* Stale NFS file handle */
  288. #define OPENAT_EUCLEAN 117 /* Structure needs cleaning */
  289. #define OPENAT_ENOTNAM 118 /* Not a XENIX named type file */
  290. #define OPENAT_ENAVAIL 119 /* No XENIX semaphores available */
  291. #define OPENAT_EISNAM 120 /* Is a named type file */
  292. #define OPENAT_EREMOTEIO 121 /* Remote I/O error */
  293. #define OPENAT_EDQUOT 122 /* Quota exceeded */
  294. #define OPENAT_ENOMEDIUM 123 /* No medium found */
  295. #define OPENAT_EMEDIUMTYPE 124 /* Wrong medium type */
  296. char *ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen);
  297. char*ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen);
  298. int ip6addr_aton(const char *cp, ip6_addr_t *addr);
  299. int ip4addr_aton(const char *cp, ip4_addr_t *addr);
  300. /**
  301. * @defgroup iot_sdk_socket socket接口
  302. * @{
  303. */
  304. /**@example socket/demo_socket.c
  305. * socket接口示例
  306. */
  307. /**创建socket
  308. *@param domain: 仅支持AF_INET (IPV4 网络协议)
  309. @param type: 支持SOCK_STREAM/SOCK_DGRAM,分别表示TCP、UDP连接
  310. @param protocol: 仅支持0
  311. *@return >=0: socket描述符,用于后续操作
  312. * <0: 创建socket失败
  313. *@note 创建的socket不用后需要用close将其关闭
  314. **/
  315. int socket(int domain, int type, int protocol);
  316. /**获取域名对应的IP地址
  317. *@param name: 域名,例如:www.airm2m.com/www.baidu.com
  318. *@return struct hostent 结构体: 该结构体包含了一个DNS域名解析后的ip地址
  319. * NULL: 域名解析失败
  320. **/
  321. struct hostent* gethostbyname(const char *name);
  322. /**关闭socket
  323. *@param fd: 调用socket接口返回的socket描述符
  324. *@return 0: 表示成功
  325. -1 表示有错误
  326. *
  327. **/
  328. int close (int fd);
  329. /**设置socket的属性
  330. *@param socketfd: 调用socket接口返回的socket描述符
  331. @param level: 支持SOL_SOCKET/IPPROTO_TCP
  332. @param optname: SOL_SOCKET对应optname为 SO_DEBUG/SO_OOBINLINE/SO_SNDTIMEO/SO_RCVTIMEO/SO_RCVBUF/SO_SNDBUF
  333. IPPROTO_TCP对应optname为 SO_TCP_SACKDISABLE/SO_TCP_NODELAY
  334. @param optval_p:
  335. @param optlen:
  336. *@return 0: 表示成功
  337. <0 表示有错误
  338. *
  339. **/
  340. int setsockopt(int socketfd,
  341. int level,
  342. int optname,
  343. void *optval_p,
  344. openat_socklen_t optlen);
  345. /**获取socket的属性
  346. *@param socketfd: 调用socket接口返回的socket描述符
  347. @param level: 支持SOL_SOCKET/IPPROTO_TCP
  348. @param optname: SOL_SOCKET对应optname为 SO_DEBUG/SO_OOBINLINE/SO_SNDTIMEO/SO_RCVTIMEO/SO_RCVBUF/SO_SNDBUF
  349. IPPROTO_TCP对应optname为 SO_TCP_SACKDISABLE/SO_TCP_NODELAY
  350. @param optval_p:
  351. @param optlen_p:
  352. *@return 0: 表示成功
  353. <0 表示有错误
  354. *
  355. **/
  356. int getsockopt(int socketfd,
  357. int level,
  358. int optname,
  359. void *optval_p,
  360. openat_socklen_t* optlen_p);
  361. /**设置socket的本地端口和ip地址,一般针对服务器代码需要设置
  362. *@param socketfd: 调用socket接口返回的socket描述符
  363. @param my_addr: ip地址和端口,ip一般设置INADDR_ANY
  364. @param addrlen: 地址长度
  365. *@return 0: 表示成功
  366. <0 表示有错误
  367. *
  368. **/
  369. int bind(int socketfd,
  370. const struct openat_sockaddr *my_addr,
  371. openat_socklen_t addrlen);
  372. /**建立和服务器端的连接
  373. *@param socketfd: 调用socket接口返回的socket描述符
  374. @param addr: 指定服务器地址和端口
  375. @param addrlen: sizeof(struct openat_sockaddr)
  376. *@return 0: 表示成功
  377. <0 表示有错误
  378. *
  379. **/
  380. int connect(int socketfd, const struct openat_sockaddr *addr, openat_socklen_t addrlen);
  381. /**监听socket连接,一般用作服务器监听客户端的连接
  382. *@param socketfd: 调用socket接口返回的socket描述符
  383. @param backlog: 0
  384. *@return 0: 表示成功
  385. <0 表示有错误
  386. *
  387. **/
  388. int listen(int socketfd,
  389. int backlog);
  390. /**等待连接,一般用于listen之后等待客户端的连接
  391. *@param socketfd: 调用socket接口返回的socket描述符
  392. @param addr: 返回客户端ip地址和端口
  393. @param addrlen: 返回地址长度
  394. *@return 0: 表示成功
  395. <0 表示有错误
  396. *@note 函数会一直阻塞,知道有客户端连接
  397. **/
  398. int accept(int socketfd,
  399. struct openat_sockaddr *addr,
  400. openat_socklen_t *addrlen);
  401. /**接收数据
  402. *@param socketfd: 调用socket接口返回的socket描述符
  403. @param buf: 用于存放数据的缓存
  404. @param len: buf的长度
  405. @param flags: 仅支持MSG_DONTWAIT/MSG_PEEK/MSG_OOB,可以通过或来指定多个标志,一般为0
  406. *@return >0: 接收到的数据长度
  407. =0: 对方已经断开连接
  408. <0: 读取错误
  409. *@note 当flags没有设置MSG_DONTWAIT,该函数会阻塞,直到有数据或者读取超时
  410. **/
  411. int recv(int socketfd,
  412. void *buf,
  413. size_t len,
  414. int flags);
  415. /**接收指定ip地址发送来的数据,一般用于UDP收取数据
  416. *@param sockfd: 调用socket接口返回的socket描述符
  417. @param buf: 用于存放数据的缓存
  418. @param len: buf的长度
  419. @param flags: 仅支持0
  420. @param src_addr: ip地址和端口
  421. @param addrlen: sizeof(struct openat_sockaddr)
  422. *@return >0: 实际收到的数据长度
  423. =0: 对方已经断开连接
  424. <0: 读取错误
  425. **/
  426. int recvfrom(int sockfd, void *buf, size_t len, int flags,
  427. struct openat_sockaddr *src_addr, openat_socklen_t *addrlen);
  428. /**发送数据
  429. *@param socketfd: 调用socket接口返回的socket描述符
  430. @param msg: 数据内容
  431. @param len: 数据长度
  432. @param flags: 仅支持MSG_DONTWAIT/MSG_OOB,可以通过或来指定多个标志,一般为0
  433. *@return >=0: 实际发送的长度
  434. <0: 发送错误
  435. **/
  436. int send(int socketfd,
  437. const void *msg,
  438. size_t len,
  439. int flags);
  440. /**发送数据到指定ip地址,一般用于udp发送数据
  441. *@param socketfd: 调用socket接口返回的socket描述符
  442. @param buf: 数据内容
  443. @param len: 数据长度
  444. @param flags: 仅支持0
  445. @param to_p: 指定ip地址和端口号
  446. @param tolen: sizeof(struct openat_sockaddr)
  447. *@return >=0: 实际发送的长度
  448. <0: 发送错误
  449. **/
  450. int sendto(int socketfd,
  451. const void *buf,
  452. size_t len,
  453. int flags,
  454. const struct openat_sockaddr *to_p,
  455. openat_socklen_t tolen);
  456. /**阻塞方式等待socket连接的状态
  457. *@param maxfdp1: 最大socketfd+1
  458. @param readset: 读取集合,可以为NULL
  459. @param writeset: 写集合,可以为NULL
  460. @param exceptset: 异常集合,可以为NULL
  461. @param timeout: 超时时间
  462. *@return 0: 等待超时
  463. >0: readset+writeset+exceptset的集合个数
  464. <0 -1
  465. **/
  466. int select(int maxfdp1,
  467. openat_fd_set *readset,
  468. openat_fd_set *writeset,
  469. openat_fd_set *exceptset,
  470. struct openat_timeval *timeout);
  471. /**获取socket的错误值
  472. *@param socketfd: 调用socket接口返回的socket描述符
  473. *@return [EBADF 到 ENO_RECOVERY]
  474. **/
  475. int socket_errno(int socketfd);
  476. /**设备驱动程序中设备控制接口
  477. *@param socketfd: 调用socket接口返回的socket描述符
  478. @param cmd: 指令,如某一个命令对应驱动层的某一个功能
  479. @param argp: 可变参数,跟命令有关,传递进入驱动层的参数或者是接收数据的缓存
  480. *@return >=0: 实际发送的长度
  481. <0: 发送错误
  482. **/
  483. int ioctl(int socketfd, long cmd, void *argp);
  484. /**获取一个描述符的名字
  485. *@param socketfd: 调用socket接口返回的socket描述符
  486. @param name: 描述符的名字
  487. @param namelen: 描述符的名字长度
  488. *@return 0: 表示成功
  489. <0 表示有错误
  490. **/
  491. int getsockname (int socketfd, struct openat_sockaddr *name, openat_socklen_t *namelen);
  492. /**主机名到地址解析
  493. *@param nodename: 一个主机名或者地址串
  494. @param servname: 服务名可以是十进制的端口号,也可以是已定义的服务名称
  495. @param hints: 可以是一个空指针,也可以是一个指向某个openat_addrinfo结构体的指针
  496. @param res: 通过res指针参数返回一个指向openat_addrinfo结构体链表的指针
  497. *@return >=0: 实际发送的长度
  498. <0: 发送错误
  499. *@note 仅仅支持IPv4,且不允许调用者指定所需地址类型的任何信息,
  500. 返回的结构只包含了用于存储IPv4地址的空间
  501. **/
  502. int getaddrinfo(const char *nodename,
  503. const char *servname,
  504. const struct openat_addrinfo *hints,
  505. struct openat_addrinfo **res);
  506. /**存储空间通过调用freeaddrinfo 返还给系统
  507. *@param ai: 指向由getaddrinfo返回的第一个openat_addrinfo结构
  508. *
  509. **/
  510. void freeaddrinfo(struct openat_addrinfo *ai);
  511. /**将IP地址由“点分十进制”转换“二进制整数”
  512. *@param af: 地址簇
  513. *@param src: 源地址
  514. *@param dst: 接收转换后的数据
  515. *@param size: 缓存区dst的大小
  516. *@return >0: 成功
  517. <=0: 失败
  518. **/
  519. #define inet_ntop(af,src,dst,size) \
  520. (((af) == AF_INET6) ? ip6addr_ntoa_r((const ip6_addr_t*)(src),(dst),(size)) \
  521. : (((af) == AF_INET) ? ip4addr_ntoa_r((const ip4_addr_t*)(src),(dst),(size)) : NULL))
  522. /**将IP地址由“二进制整数”转换“点分十进制”
  523. *@param af: 地址簇
  524. *@param src: 源地址
  525. *@param dst: 接收转换后的数据
  526. *@return >0: 成功
  527. <=0: 失败
  528. **/
  529. #define inet_pton(af,src,dst) \
  530. (((af) == AF_INET6) ? ip6addr_aton((src),(ip6_addr_t*)(dst)) \
  531. : (((af) == AF_INET) ? ip4addr_aton((src),(ip4_addr_t*)(dst)) : 0))
  532. /**本地字节顺序转化为网络字节顺序(16bits)
  533. *@param n: 本地字节书序数据
  534. *@return 网络字节顺序数据
  535. **/
  536. #define htons(n) ((n & 0xff) << 8) | ((n & 0xff00) >> 8)
  537. /**本地字节顺序转化为网络字节顺序(32bits)
  538. *@param n: 本地字节书序数据
  539. *@return 网络字节顺序数据
  540. **/
  541. #define htonl(n) ((n & 0xff) << 24) |\
  542. ((n & 0xff00) << 8) |\
  543. ((n & 0xff0000UL) >> 8) |\
  544. ((n & 0xff000000UL) >> 24)
  545. /**网络字节顺序转化为本地字节顺序(16bits)
  546. *@param n: 网络字节顺序
  547. *@return 本地字节顺序
  548. **/
  549. #define ntohs(n) htons(n)
  550. /**网络字节顺序转化为本地字节顺序(32bits)
  551. *@param n: 网络字节顺序
  552. *@return 本地字节顺序
  553. **/
  554. #define ntohl(n) htonl(n)
  555. /**将ip地址字符串转为数值,转化后的数值为网络字节顺序
  556. *@param cp: ip地址字符串,例如"192.168.1.1"
  557. *@param addr: struct in_addr 返回的ip地址数值
  558. *@return 1: 成功
  559. 0: 失败
  560. **/
  561. #define inet_aton(cp, addr) ipaddr_aton(cp, (openat_ip_addr_t*)addr)
  562. /**将ip地址数值(网络字节顺序),转化为ip地址字符串
  563. *@param addr: struct in_addr ip地址数值
  564. *@return ip地址字符串
  565. **/
  566. #define inet_ntoa(addr) ipaddr_ntoa((openat_ip_addr_t*)&(addr))
  567. /**
  568. * Check whether "cp" is a valid ascii representation
  569. * of an Internet address and convert to a binary address.
  570. * Returns 1 if the address is valid, 0 if not.
  571. * This replaces inet_addr, the return value from which
  572. * cannot distinguish between failure and a local broadcast address.
  573. *
  574. * @param cp IP address in ascii represenation (e.g. "127.0.0.1")
  575. * @param addr pointer to which to save the ip address in network order
  576. * @return 1 if cp could be converted to addr, 0 on failure
  577. */
  578. int
  579. ipaddr_aton(const char *cp, openat_ip_addr_t *addr);
  580. /**
  581. * Ascii internet address interpretation routine.
  582. * The value returned is in network order.
  583. *
  584. * @param cp IP address in ascii represenation (e.g. "127.0.0.1")
  585. * @return ip address in network order
  586. */
  587. UINT32
  588. ipaddr_addr(const char *cp);
  589. /**
  590. * Same as ipaddr_ntoa, but reentrant since a user-supplied buffer is used.
  591. *
  592. * @param addr ip address in network order to convert
  593. * @param buf target buffer where the string is stored
  594. * @param buflen length of buf
  595. * @return either pointer to buf which now holds the ASCII
  596. * representation of addr or NULL if buf was too small
  597. */
  598. char *ipaddr_ntoa_r(const openat_ip_addr_t *addr, char *buf, int buflen);
  599. /**
  600. * Convert numeric IP address into decimal dotted ASCII representation.
  601. * returns ptr to static buffer; not reentrant!
  602. *
  603. * @param addr ip address in network order to convert
  604. * @return pointer to a global static (!) buffer that holds the ASCII
  605. * represenation of addr
  606. */
  607. char *
  608. ipaddr_ntoa(const openat_ip_addr_t *addr);
  609. /** @}*/
  610. #endif