xt-sdk 文档 v1.0.3
xt-sdk 嵌入式 SDK API 参考
载入中...
搜索中...
未找到
xt_socket.h 文件参考

跨平台 Socket 抽象层 更多...

#include "lwip/sockets.h"
#include "lwip/netdb.h"
#include <stdint.h>
#include "xt_utils.h"

浏览该文件的源代码.

宏定义

#define XT_SOCKET_INVALID   (-1)
#define XT_SOCKET_ERROR   (-1)
#define closesocket(s)
#define XT_SELECT_NFDS(fd)

类型定义

typedef int xt_socket_t

函数

xt_err_t xt_socket_setup (void)
 初始化 Socket 平台层
void xt_socket_cleanup (void)
 反初始化 Socket 平台层
int xt_socket_errno (void)
 获取最近一次 Socket 操作的错误码
const char * xt_socket_strerror (int err)
 将 Socket 错误码转为可读字符串
xt_err_t xt_socket_set_nonblock (xt_socket_t s, int nonblock)
 设置或清除 Socket 非阻塞模式
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 的跨平台封装)

详细描述

跨平台 Socket 抽象层

作者
your name (you@d.nosp@m.omai.nosp@m.n.com)
版本
0.2
日期
2026-06-11

SPDX-FileCopyrightText: 2025 深圳市天工聚创科技有限公司 SPDX-License-Identifier: Apache-2.0


组件说明

本组件提供跨平台 BSD Socket 统一接口。在 Windows(Winsock2)、Linux(POSIX) 以及基于 lwip 的嵌入式平台(lm620_internal、quectel 等)上,让用户使用 标准 BSD API 编写网络应用,无需关心平台差异。

标准 BSD 函数名(socket、bind、connect、send、recv 等)在各平台直接可用。 本层只处理平台无法统一的少数差异(初始化/清理、socket 类型、错误处理等)。


使用方式

  1. 包含本文件:#include "xt_socket.h"
  2. 初始化:调用 xt_socket_setup() 完成平台初始化
  3. 直接使用标准 BSD API(socket、bind、connect、send、recv 等)
  4. 退出时调用 xt_socket_cleanup() 释放平台资源

完整示例见:examples/network/socket_multi_platform/example_main.c


平台支持

平台 检测宏 说明 ───────────── ───────────────────────── ────────────────────────── Windows XT_SDK_PLATFORM_WINDOWS Winsock2,需 WSAStartup Linux XT_SDK_PLATFORM_LINUX POSIX,原生 BSD API lwip 嵌入式 默认(else 分支) lm620_internal、quectel 等

平台检测优先级:Windows > Linux > lwip


已抽象的能力

能力 接口/宏 平台差异 ──────────────── ────────────────────────── ────────────────────── 初始化 xt_socket_setup() Win: WSAStartup 清理 xt_socket_cleanup() Win: WSACleanup Socket 类型 xt_socket_t 统一 int / SOCKET 无效句柄 XT_SOCKET_INVALID 统一 -1 / INVALID_SOCKET 错误句柄 XT_SOCKET_ERROR 统一 -1 / SOCKET_ERROR 错误码获取 xt_socket_errno() 统一 errno / WSAGetLastError 错误描述 xt_socket_strerror() 统一 strerror / 内置表 关闭函数 closesocket() 宏 Lin: close 关闭方向常量 SHUT_RD / SHUT_WR / SHUT_RDWR Win: SD_* 映射 POSIX R/W xt_socket_read() / xt_socket_write() 统一 read / recv 非阻塞模式 xt_socket_set_nonblock() 统一 fcntl / ioctlsocket


未抽象的能力(直接使用标准 BSD API,已跨平台统一)

socket() / bind() / connect() / listen() / accept() send() / recv() / sendto() / recvfrom() setsockopt() / getsockopt() select() / shutdown() getaddrinfo() / freeaddrinfo() inet_pton() / inet_ntop() getsockname() / getpeername() struct sockaddr_in / struct sockaddr_in6 struct timeval / fd_set 等标准结构体


已知平台差异(接口同名但语义不同,需注意)

SO_REUSEADDR Windows 允许完全相同的地址(IP:端口)重复绑定;POSIX/Linux 只允许 TIME_WAIT 状态地址重用。跨平台代码应注意此差异。

SO_RCVTIMEO Windows 上每次 recv() 后超时不自动保留;Linux 上持续生效。

SO_ERROR getsockopt(SO_ERROR) 读取后清零(消费型语义),多线程环境中可能丢失错误。

select() nfds 参数 Windows 忽略 nfds 参数;POSIX 要求 nfds = 最大 fd + 1。

lwip 配置依赖 lwip 平台需要 LWIP_SOCKET=1、LWIP_SO_RCVTIMEO(若使用超时)、IP_TTL(若使用 TTL) 等配置开启。errno 通过 lwip/errno.h 提供,需 LWIP_PROVIDE_ERRNO 或等效配置。

警告
Windows 平台注意:如果先包含 windows.h 再包含本文件, 会导致 winsock.h 与 winsock2.h 冲突。建议在包含 windows.h 之前 定义 WIN32_LEAN_AND_MEAN,或确保 xt_socket.h 在 windows.h 之前包含。

版本变更

v0.1 -> v0.2:

  • xt_socket_init() → xt_socket_setup()
  • xt_socket_get_error() → xt_socket_errno()
  • 平台检测改为 Windows > Linux > lwip 优先级
  • lwip 分支从 lm620_internal 专用改为通用(覆盖 quectel 等)

在文件 xt_socket.h 中定义.