xt-sdk 文档 v1.0.3
xt-sdk 嵌入式 SDK API 参考
载入中...
搜索中...
未找到
xt_socket.h
浏览该文件的文档.
1
112
113#ifndef __XT_SOCKET_H__
114#define __XT_SOCKET_H__
115
116/* ==================== [Includes] ========================================== */
117
118#if defined(XT_SDK_PLATFORM_WINDOWS)
119
120#include <winsock2.h>
121#include <ws2tcpip.h>
122
123#elif defined(XT_SDK_PLATFORM_LINUX)
124
125#include <sys/socket.h>
126#include <netinet/in.h>
127#include <netinet/tcp.h>
128#include <arpa/inet.h>
129#include <netdb.h>
130#include <sys/time.h>
131#include <unistd.h>
132#include <fcntl.h>
133
134#else
135
136#include "lwip/sockets.h"
137#include "lwip/netdb.h"
138
139#endif
140
141#include <stdint.h>
142#include "xt_utils.h"
143
144#ifdef __cplusplus
145extern "C" {
146#endif
147
154
155/* ==================== [Defines] =========================================== */
156
157#if defined(XT_SDK_PLATFORM_WINDOWS)
158
159#ifndef SHUT_RD
160#define SHUT_RD SD_RECEIVE
161#endif
162#ifndef SHUT_WR
163#define SHUT_WR SD_SEND
164#endif
165#ifndef SHUT_RDWR
166#define SHUT_RDWR SD_BOTH
167#endif
168
169typedef SOCKET xt_socket_t;
170#define XT_SOCKET_INVALID INVALID_SOCKET
171#define XT_SOCKET_ERROR SOCKET_ERROR
172
173#elif defined(XT_SDK_PLATFORM_LINUX)
174
175#ifndef closesocket
176#define closesocket(s) close(s)
177#endif
178
179typedef int xt_socket_t;
180#define XT_SOCKET_INVALID (-1)
181#define XT_SOCKET_ERROR (-1)
182
183#else
184/* 默认 lwip 平台(lm620_internal、quectel 等嵌入式平台) */
185
186#ifndef errno
187#error "xt_socket: lwip platform requires errno - check LWIP_PROVIDE_ERRNO in lwipopts.h"
188#endif
189
190typedef int xt_socket_t;
191#define XT_SOCKET_INVALID (-1)
192#define XT_SOCKET_ERROR (-1)
193
194#ifndef closesocket
195#define closesocket(s) lwip_close(s)
196#endif
197
198#endif
199
200/* ==================== [Defines] =========================================== */
201
202/*
203 * select() 的 nfds 参数跨平台安全计算。
204 * Windows 忽略此参数,传入 0 避免 SOCKET→int 截断。
205 * POSIX 需传入最大 fd + 1。
206 */
207#if !defined(XT_SELECT_NFDS)
208#if defined(XT_SDK_PLATFORM_WINDOWS)
209#define XT_SELECT_NFDS(fd) 0
210#else
211#define XT_SELECT_NFDS(fd) ((int)(fd) + 1)
212#endif
213#endif
214
215/* ==================== [Global Prototypes] ================================= */
216
234
248
266
285const char *xt_socket_strerror(int err);
286
310
323static inline int xt_socket_read(xt_socket_t s, void *buf, size_t len)
324{
325#if defined(XT_SDK_PLATFORM_WINDOWS)
326 return recv(s, buf, (int)len, 0);
327#else
328 int ret;
329 do {
330 ret = (int)read(s, buf, len);
331 } while (ret < 0 && errno == EINTR);
332 return ret;
333#endif
334}
335
347static inline int xt_socket_write(xt_socket_t s, const void *buf, size_t len)
348{
349#if defined(XT_SDK_PLATFORM_WINDOWS)
350 return send(s, buf, (int)len, 0);
351#else
352 int ret;
353 do {
354 ret = (int)write(s, buf, len);
355 } while (ret < 0 && errno == EINTR);
356 return ret;
357#endif
358}
359
360/* ==================== [Macros] ============================================ */
361 /* xt_socket */
363
364#ifdef __cplusplus
365} /* extern "C" */
366#endif
367
368#endif /* __XT_SOCKET_H__ */
int32_t xt_err_t
错误码类型
static int xt_socket_read(xt_socket_t s, void *buf, size_t len)
从 Socket 读取数据(POSIX read 的跨平台封装)
static int xt_socket_write(xt_socket_t s, const void *buf, size_t len)
向 Socket 写入数据(POSIX write 的跨平台封装)
xt_err_t xt_socket_set_nonblock(xt_socket_t s, int nonblock)
设置或清除 Socket 非阻塞模式
xt_err_t xt_socket_setup(void)
初始化 Socket 平台层
int xt_socket_t
int xt_socket_errno(void)
获取最近一次 Socket 操作的错误码
void xt_socket_cleanup(void)
反初始化 Socket 平台层
const char * xt_socket_strerror(int err)
将 Socket 错误码转为可读字符串
XTINY 通用工具函数集合(字节序、对齐读取、log2 等)