Socket

Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.


概述

IP地址与域名

IP地址是网络中的主机地址,用于两台网络主机能够互相找到彼此,这也是网络通信能够成功进行的基础。IP地址一般以点分十进制的字符串来表示,如 192.168.1.1

../../../_images/image_JU72bY2Rwoy1ZPxl5QrchqEanug.webp

我们日常访问的网站,其所在的服务器主机都有唯一的IP地址,网络中的主机不计其数,靠记IP地址的方式来区分不同的主机显然比较困难,并且同一个网站可能有多个不同的IP地址,或者IP地址会因为某种原因而更换。

因此,用域名表示网站地址的方式便应运而生,如我们常见的 www.baidu.com 比IP地址更容易被记住。因为实际的网络通信报文中使用的仍然是IP地址,所以需要使用 域名解析 协议去获取域名背后所对应的 IP地址。

下文的讲解均以 IPv4 协议为基础。

OSI七层模型

国际标准化组织(ISO)制定的一个用于计算机或通信系统的标准体系,一般被称为OSI(Open System Interconnection)七层模型。它为网络通信协议的实现提供了一个标准,通信双方在相同的层使用相同的协议,即可进行通信;就同一台设备而言,下层协议为上层协议提供了调用接口,将上层协议打包为底层协议,最终发送到网络上进行传输。

这七层分别为:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。

../../../_images/image_JjJsbrYJqoQ991xCVIIc9WHqnCg.webp

为了简化协议实现或者方便理解,五层模型或者四层模型的概念也诞生了。四层模型一般被提及的比较多,包括:应用层、传输层、网络层、网络接口层。

../../../_images/image_YhnSbhlqLoQrkvxAgvOcSvI8ndc.webp

上文中的IP地址则属于网络层。

网络层用于把该主机所有的网络数据转发到网卡,经由物理层电路发送到网络中去。

为了方便阐述,下文将按照四层模型来进行讲解。

传输层协议

IP地址解决了网络中两台主机如何能够找到彼此,进而进行报文收发的问题。

试想下,一台主机上可能运行着多个应用程序,执行着不同的网络任务。这时,某台IP地址的主机收到了另一台主机的报文,这个报文数据要传递给哪个应用程序呢?

为了解决这个问题,人们基于网络层协议演化出了传输层协议,传输层协议为本地的网络应用分配不同的端口。收到网络层的报文后,根据不同的端口号,将数据递交给不同的应用。

为了应对不同的场景,传输层协议分为UDP和TCP协议。

TCP协议具有以下特点:

  • 面向连接

  • 每条连接只能有两个端点,即点对点

  • 提供可靠的数据交付

  • 全双工通信

  • 面向字节流

根据不同的需求,基于TCP衍生出了一些应用层协议,不同的应用会默认指定一个端口号。端口号亦可根据实际情况更换。

常见的基于TCP的应用协议及端口如下:

../../../_images/image_DuVzb5bEVolhZ0x9weBcwo4insc.webp

序列号:建立连接的时候生成的随机数,通过SYN包传给主机,用来解决网络传输的乱序问题。

应答号:指下一次期望收到的数据序列号,配合上面的序列号一来解决丢包和乱序的问题。

控制位:(下面都是控制位的具体值,只能是0或者1)

ACK:表示此条消息为应答的消息,除了最初建立连接的SYN包之外的这个控制位都为1。

RST:表示TCP 连接中出现异常,需要强制断开连接

SYN:表示希望建立连接,在序列号字段进行初始值的设定。

FIN:表示后面不会再传输数据希望断开连接。

熟知端口号

协议

说明

0

保留

7

echo

报文回送服务器

20

FTP-DATA

文件传输协议(数据)

21

FTP

文件传输协议

23

Telnet

终端连接

25

SMTP

简单邮件传输协议

53

DNS

域名服务器

80

HTTP

HTTP服务器

110

POP3

邮局协议版本3

1080

SOCKS

代理服务器协议

确定TCP连接的五元组:协议类型(TCP)、本地IP、本地端口、远端IP、远端端口。UDP协议具有以下特点:

  • 无连接

  • 支持一对一、一对多和多对多通信

  • 不保证可靠交付

  • 全双工通信

  • 面向报文

根据不同的需求,基于UDP衍生出了一些应用层协议,不同的应用会默认指定一个端口号。端口号亦可根据实际情况更换。

常见的基于UDP的应用协议及端口如下:

../../../_images/image_GujSbwqExoArJKxkaeLcr0KRnLg.webp

相比之下UDP因为是面向无连接,同时不提供复杂的控制机制,所以协议十分的简短,头部只有8个字节(64位),仅包括目标和源端口号,UDP首部和数据长度以及校验和(判断UDP是否完整)。

熟知端口号

协议

说明

0

保留

7

echo

报文回送服务器

53

nameserver

域名服务器

67

bootps

BOOT或DHCP服务器

68

bootpc

BOOT或DHCP客户端

69

TFTP

简单文件传输协议

123

NTP

网络时间协议

161

SNMP

简单网络管理协议

API说明

头文件

qcm_socket_adp.h

函数表

函数名

描述

qcm_socket_create()

创建Socket套接字,支持TCP和UDP协议

qcm_socket_connect()

TCP客户端连接远程服务器

qcm_socket_register_event()

注册Socket事件

qcm_socket_read()

从已连接的Socket接收TCP数据

qcm_socket_send()

发送TCP数据到已连接的服务器

qcm_socket_listen()

将Socket设置为监听模式(TCP服务器端)

qcm_socket_accept()

接受Socket连接请求(TCP服务器端)

qcm_socket_close()

关闭连接并释放Socket资源

qcm_socket_sendto()

发送UDP数据到指定目的地址和端口

qcm_socket_recvfrom()

接收UDP数据并获取发送方地址信息

qcm_socket_set_opt()

设置Socket选项

qcm_socket_get_opt()

获取Socket选项

qcm_socket_ssl_config()

配置SSL参数(仅TCP)

qcm_socket_ssl_connect()

SSL连接认证(仅TCP)

qcm_socket_ssl_is_init_already()

检查SSL配置是否已初始化(仅TCP)

qcm_socket_ssl_clean()

释放SSL资源而不关闭Socket(仅TCP)

qcm_socket_shutdown()

关闭Socket的读写通道

qcm_socket_set_system_opt()

设置系统选项

qcm_socket_get_system_opt()

获取系统选项

qcm_socket_checkip_is_ip46()

判断IP字符串类型(IPv4/IPv6/DNS)

qcm_inet_ntop()

网络IP地址转点分十进制字符串

qcm_socket_get_last_close_event()

获取TCP最后关闭的原因

函数定义

qcm_socket_create

函数原型

int qcm_socket_create(qosa_uint8_t simid, qosa_uint8_t pdpcid, int family, int type, int protocol, int local_port, qosa_bool_t block);

功能描述

  • 获取PDP ID指定的PDP上下文信息,创建socket,绑定本地IP地址和 local_port,返回用户句柄

参数描述

  • simid:SIM卡ID,用于指定使用哪个SIM卡的数据连接

  • pdpcid:PDP上下文ID,用于指定PDP连接上下文

  • family:地址族,如:

    • QCM_AF_INET:IPv4地址族

    • QCM_AF_INET6:IPv6地址族

  • type:Socket类型,如:

    • QCM_SOCK_STREAM:TCP流式Socket

    • QCM_SOCK_DGRAM:UDP数据报Socket

  • protocol:协议类型,如:

    • QCM_TCP_PROTOCOL:TCP协议

    • QCM_UDP_PROTOCOL:UDP协议

  • local_port:本地端口号,设为0表示由系统自动分配

  • block:阻塞模式标识

    • QOSA_TRUE:阻塞模式

    • QOSA_FALSE:非阻塞模式

返回值

  • 成功:返回对应的socket句柄

  • 失败:返回负值,具体信息请参考 qcm_sock_err_code


qcm_socket_connect

函数原型

int qcm_socket_connect(int s, qosa_ip_addr_t *remote_ip, int remote_port);

功能描述

  • TCP客户端连接远程服务器,应在DNS解析成功后执行

参数描述

  • s:要操作的Socket句柄(由 qcm_socket_create 创建)

  • remote_ip:远程服务器IP地址结构体指针

  • remote_port:要连接的远程端口号

返回值

  • 成功:返回0

  • 失败:返回负值,具体信息请参考 qcm_sock_err_code


qcm_socket_register_event

函数原型

int qcm_socket_register_event(int s, int event_mask, qcm_socket_event_cb func, void *argv);

功能描述

  • 在非阻塞模式下监听对应的事件并设置回调,当产生了监听的事件则会执行回调函数,用户参数会传入回调函数中

参数描述

  • s:socket句柄

  • event_mask:监听的事件,参考 qcm_sock_event_mask_opt_e

  • func:事件产生时的回调函数

  • argv:用户参数,传入事件回调函数中

返回值

  • 成功:返回0

  • 失败:返回负值,具体信息请参考 qcm_sock_err_code


qcm_socket_read

函数原型

int qcm_socket_read(int s, char *data, int sz);

功能描述

  • 从已连接的Socket接收TCP数据

参数描述

  • s:已连接的Socket文件描述符

  • data:接收数据缓冲区指针

  • sz:接收缓冲区大小

返回值

  • 成功:返回实际接收的字节数

  • 注意:如果实际返回的长度小于 sz 的大小,应再次调用发送函数来发送数据,以触发底层的“会阻塞”状态报告。

  • 失败:返回负值,具体信息请参考 qcm_sock_err_code


qcm_socket_send

函数原型

int qcm_socket_send(int s, char *data, int sz);

功能描述

  • 发送TCP数据到已连接的服务器

参数描述

  • s:已连接的Socket文件描述符

  • data:待发送数据缓冲区指针

  • sz:待发送数据长度

返回值

  • 成功:返回实际发送的字节数

  • 失败:返回负值,具体信息请参考 qcm_sock_err_code


qcm_socket_listen

函数原型

int qcm_socket_listen(int s, int backlog);

功能描述

  • 将Socket设置为监听模式,用于TCP服务器端等待客户端连接请求

参数描述

  • s:要操作的Socket句柄(由 qcm_socket_create 创建)

  • backlog:等待连接队列的最大长度,用于处理同时到达的多个连接请求

返回值

  • 成功:返回0

  • 失败:返回负值,具体信息请参考 qcm_sock_err_code


qcm_socket_accept

函数原型

int qcm_socket_accept(int s, qosa_ip_addr_t *remote_addr, int *remote_port, qosa_ip_addr_t *local_addr, int *local_port);

功能描述

  • 接受Socket连接请求,新创建的Socket连接是否阻塞取决于监听Socket的阻塞参数配置

  • 该函数需要在调用 qcm_socket_listen 后执行

参数描述

  • s:要操作的Socket句柄(监听Socket)

  • remote_addr:返回新连接的对端IP地址

  • remote_port:返回新连接的对端端口号

  • local_addr:返回本地IP地址

  • local_port:返回本地端口号

返回值

  • 成功:返回新连接的Socket句柄

  • 失败:返回负值,具体信息请参考 qcm_sock_err_code


qcm_socket_close

函数原型

int qcm_socket_close(int s);

功能描述

  • 关闭TCP连接并释放Socket资源

参数描述

  • s:待关闭的Socket文件描述符

返回值

  • 成功:返回0

  • 失败:返回负值,具体信息请参考 qcm_sock_err_code


qcm_socket_sendto

函数原型

int qcm_socket_sendto(int s, qosa_ip_addr_t *remote_addr, qosa_uint16_t remote_port, char *data, int sz);

功能描述

  • 发送UDP数据到指定目的地址和端口

  • 主要用于UDP Socket的数据发送

参数描述

  • s:已建立的Socket文件描述符(UDP类型)

  • remote_addr:目的IP地址结构体指针

  • remote_port:目的端口号

  • data:待发送数据缓冲区指针

  • sz:待发送数据长度

返回值

  • 成功:返回实际发送的字节数

  • 失败:返回负值,具体信息请参考 qcm_sock_err_code


qcm_socket_recvfrom

函数原型

int qcm_socket_recvfrom(int s, qosa_ip_addr_t *remote_addr, qosa_uint16_t *remote_port, char *data, int sz);

功能描述

  • 从Socket接收数据,并将发送方的地址信息存储在指定位置

  • 主要用于UDP Socket的数据接收

参数描述

  • s:已建立的Socket文件描述符(用于通信)

  • remote_addr:接收到的数据的对方IP地址信息

  • remote_port:接收到的数据的远程端口号

  • data:接收数据的缓冲区指针

  • sz:缓冲区大小(字节数)

返回值

  • 成功:返回实际接收的字节数

  • 失败:返回负值,具体信息请参考 qcm_sock_err_code


qcm_socket_set_opt

函数原型

int qcm_socket_set_opt(int s, qcm_socke_option_e opt, void *value);

功能描述

  • 设置Socket选项

参数描述

  • s:已建立的Socket文件描述符(用于通信)

  • opt:选项名称,用于指定要设置的选项

  • value:存储选项值的缓冲区指针

返回值

  • 成功:返回0

  • 失败:返回负值,具体信息请参考 qcm_sock_err_code


qcm_socket_get_opt

函数原型

int qcm_socket_get_opt(int s, qcm_socke_option_e opt, void *value);

功能描述

  • 获取Socket选项接口

参数描述

  • s:已建立的Socket文件描述符(用于通信)

  • opt:选项名称,用于指定要获取的选项

  • value:存储选项值的缓冲区指针

返回值

  • 成功:返回0

  • 失败:返回负值,具体信息请参考 qcm_sock_err_code


qcm_socket_ssl_config

函数原型

qcm_sock_err_code qcm_socket_ssl_config(int s, qcm_ssl_config_t *ssl_ptr, const char *hostname, qosa_bool_t block);

功能描述

  • 配置要使用的SSL配置信息

  • 注意:此功能仅在定义了 CONFIG_QCM_VTLS_FUNC 时可用

参数描述

  • s:已建立的Socket文件描述符(用于通信)

  • ssl_ptr:SSL配置文件的指针

  • hostname:主机名

  • block:配置SSL握手会话是阻塞还是非阻塞模式

返回值

  • 成功:返回0

  • 失败:返回负值,具体信息请参考 qcm_sock_err_code


qcm_socket_ssl_connect

函数原型

qcm_sock_err_code qcm_socket_ssl_connect(int s);

功能描述

  • 连接SSL服务器

  • 函数阻塞和非阻塞模式由 qcm_socket_ssl_config 中配置的block参数控制

  • 注意:此功能仅在定义了 CONFIG_QCM_VTLS_FUNC 时可用

参数描述

  • s:已建立的Socket文件描述符(用于通信)

返回值

  • 成功:返回0

  • 失败:返回负值,具体信息请参考 qcm_sock_err_code


qcm_socket_ssl_is_init_already

函数原型

qosa_bool_t qcm_socket_ssl_is_init_already(int s);

功能描述

  • 获取SSL配置是否已经初始化

  • 注意:此功能仅在定义了 CONFIG_QCM_VTLS_FUNC 时可用

参数描述

  • s:已建立的Socket文件描述符(用于通信)

返回值

  • QOSA_TRUE:SSL配置已初始化

  • QOSA_FALSE:SSL配置未初始化


qcm_socket_ssl_clean

函数原型

qcm_sock_err_code qcm_socket_ssl_clean(int s);

功能描述

  • 仅释放SSL资源而不关闭Socket句柄

  • 注意:此功能仅在定义了 CONFIG_QCM_VTLS_FUNC 时可用

参数描述

  • s:已建立的Socket文件描述符(用于通信)

返回值

  • 成功:返回0

  • 失败:返回负值,具体信息请参考 qcm_sock_err_code


qcm_socket_shutdown

函数原型

int qcm_socket_shutdown(int s, int how);

功能描述

  • Socket关闭函数,用于关闭读取(RD)、写入(WR)通道

  • 原始 socket shutdown 函数执行成功返回0,失败返回-1并设置全局 errno

  • 错误码说明:

    • EBADF:socket不是有效的socket描述符,通常发生在socket未打开或已关闭时

    • EINVAL:how参数未设置为有效值

    • ENOBUFS:没有足够的系统资源来完成此调用,通常发生在系统资源紧张时

    • ENOTCONN:socket未连接,如果尝试关闭未连接的socket,将返回此错误

    • ENOTSOCK:描述符指向文件而不是socket

参数描述

  • s:要操作的Socket句柄

  • how:对应的操作方向

    • QCM_SHUT_RD:关闭读取通道

    • QCM_SHUT_WR:关闭写入通道

    • QCM_SHUT_RDWR:同时关闭读取和写入通道

返回值

  • 成功:返回0

  • 失败:返回负值,具体信息请参考 qcm_sock_err_code


qcm_socket_set_system_opt

函数原型

int qcm_socket_set_system_opt(qcm_socket_system_option_e opt, void *value);

功能描述

  • 设置系统选项

参数描述

  • opt:系统选项枚举

  • value:选项值指针

返回值

  • 成功:返回0

  • 失败:返回负值,具体信息请参考 qcm_sock_err_code


qcm_socket_get_system_opt

函数原型

int qcm_socket_get_system_opt(qcm_socket_system_option_e opt, void *value);

功能描述

  • 获取系统选项

参数描述

  • opt:系统选项枚举

  • value:存储选项值的缓冲区指针

返回值

  • 成功:返回0

  • 失败:返回负值,具体信息请参考 qcm_sock_err_code


qcm_socket_checkip_is_ip46

函数原型

int qcm_socket_checkip_is_ip46(char *ip_string);

功能描述

  • 简单判断输入字符串是IPv4、IPv6还是DNS类型

参数描述

  • ip_string:要检查的IP字符串

返回值

  • QCM_AF_INET:表示IPv4地址

  • QCM_AF_INET6:表示IPv6地址

  • 0:表示未知类型

  • -1:表示执行失败


qcm_inet_ntop

函数原型

const char *qcm_inet_ntop(int af, const void *src, char *dst, int size);

功能描述

  • 网络IP地址到点分十进制字符串的转换

参数描述

  • af:地址族(AF_INET或AF_INET6)

  • src:网络字节序的IP地址

  • dst:点分十进制字符串IP地址缓冲区

  • size:点分十进制字符串IP地址缓冲区大小

返回值

  • 成功:返回指向dst的指针

  • 失败:返回NULL

备注

注意:

  1. 输入参数是网络字节序,输出参数是点分十进制字符串,如"192.168.1.100"

  2. 此函数解决与之前平台格式大小不一致的问题,字符转换为大写显示


qcm_socket_get_last_close_event

函数原型

int qcm_socket_get_last_close_event(int s);

功能描述

  • 获取TCP最后关闭的原因

参数描述

  • s:要操作的Socket句柄

返回值

  • 返回具体的关闭原因代码


结构体定义

typedef struct
{
    int on_off;     /*!< option on/off */
    int linger_val; /*!< linger time in seconds */
} qcm_socket_linger_t;

枚举定义

typedef enum
{
    QCM_SOC_STATE_NONE = 0,
    QCM_SOC_STATE_CONNECTING,                  /*!< Socket is in connecting state */
    QCM_SOC_STATE_CONNECT,                     /*!< Socket connection successful */
    QCM_SOC_STATE_LISTEN,                      /*!< Socket is in listening state */
    QCM_SOC_STATE_CLOSING,                     /*!< Socket encountered error and is preparing to close */
    QCM_SOC_STATE_CLOSED = QCM_SOC_STATE_NONE, /*!< Socket connection closed */
} qcm_socket_state;
typedef enum
{
    QCM_SOCK_LINGER_OPT = 1,    /*!< Used to set delayed close time */
    QCM_SOCK_UNREAD_OPT = 2,    /*!< Used to get unread status in buffer */
    QCM_TCP_ACK_OPT = 3,        /*!< Used to get the number of ACKs in current socket connection */
    QCM_SOCK_REUSEADDR_OPT = 4, /*!< Used to configure whether to enable port address reuse option */
    QCM_IP_TTL_OPT = 5,         /*!< Used to set TTL field, indicating the maximum number of hops allowed for IP packet forwarding in the network */
#ifdef CONFIG_QOSA_LINUX_PLATFROM_CFG
    QCM_TCP_UNACK_OPT = 6,      /*!< Used to get the number of unacknowledged ACKs in current socket connection */
#endif
} qcm_socke_option_e;
typedef enum
{
    QCM_TCP_KEEPALIVE_OPT = 1,       /*!< Used to configure whether to enable TCP keepalive option function */
    QCM_TCP_KEEPIDLE_OPT = 2,        /*!< Used to configure keepalive IDLE idle time */
    QCM_TCP_KEEPINTVL_OPT = 3,       /*!< Used to configure keepalive probe packet interval time */
    QCM_TCP_KEEPCNT_OPT = 4,         /*!< Used to configure the number of keepalive probe packets sent */
    QCM_TCP_WINDOWS_SCALING_OPT = 5, /*!< Used to modify TCP Windows scale factor of system protocol stack */
    QCM_TCP_RETRY_TIME_OPT = 6,      /*!< Configure TCP retransmission interval time, must be configured together with QCM_TCP_MAX_BACKOFFS */
    QCM_TCP_RETRY_COUNT_OPT = 7,     /*!< Configure TCP retransmission count, must be configured together with QCM_TCP_RETRY_TIME_OPT */
    QCM_TCP_DELAY_ACK_OPT
            = 8, /*!< TCP protocol layer delayed sending, preventing TCP internal delay waiting for data packet sending, but still cannot completely avoid */
    QCM_TCP_TIMEWAIT_FAST_RELEASE_OPT = 9, /*!< Control underlying TCP close time wait state fast release action */
    QCM_TCP_RECV_WINDOWS_OPT = 10,         /*!< TCP protocol layer receive window size */
    QCM_TCP_SEND_WINDOWS_OPT = 11,         /*!< TCP protocol layer send window size */
    QCM_UDP_FILTER_OPT = 12,               /*!< Configure whether to filter UDP packets, preventing unrecorded UDP packet access */
    QCM_TCP_MSS_OPT = 13,                  /*!< TCP MSS configuration */
    QCM_DNS_CACHE_OPT = 14,                /*!< DNS cache configuration */
    QCM_DNS_RETRY_TIME_OPT = 15,           /*!< DNS retry time configuration */
    QCM_DNS_RETRY_COUNT_OPT = 16,          /*!< DNS retry count configuration */
} qcm_socket_system_option_e;
typedef enum
{
    QCM_SOCK_CONNECT_EVENT = 0x01,        /*!< TCP connection event notification */
    QCM_SOCK_READ_EVENT = 0x02,           /*!< Socket read event notification */
    QCM_SOCK_WRITE_EVENT = 0x04,          /*!< Socket write event notification */
    QCM_SOCK_ACCEPT_EVENT = 0x08,         /*!< Socket accept event notification */
    QCM_SOCK_CLOSE_EVENT = 0x10,          /*!< Socket close event notification */
    QCM_SOCK_SSL_HD_TIMEOUT_EVENT = 0x20, /*!< SSL handshake failure */
    QCM_SOCK_SENDENDACK_EVENT = 0x40,     /*!< TCP ACK response event notification */
    QCM_SOCK_NET_DOWN_EVENT = 0x80,       /*!< Network initiated disconnection event notification */

    QCM_SOCK_MAX
} qcm_sock_event_mask_opt_e;
typedef enum
{
    QCM_SOCK_SUCCESS = 0,          /*!< Socket operation successful */
    QCM_SOCK_OUT_MEM = -1,         /*!< Memory allocation error */
    QCM_SOCK_WODBLOCK = -2,        /*!< Wouldblock error */
    QCM_SOCK_INVALID_PARAM = -3,   /*!< Invalid parameter */
    QCM_SOCK_DNS_FAIL = -4,        /*!< DNS resolution error */
    QCM_SOCK_NOT_ALLOW = -5,       /*!< Operation not allowed */
    QCM_SOCK_BROKEN = -6,          /*!< */
    QCM_SOCK_INTERNAL_ERROR = -7,  /*!< Internal error */
    QCM_SOCK_TIMEROUT = -8,        /*!< Timeout error */
    QCM_SOCK_PDP_NO_ACTIVE = -9,   /*!< PDP not activated */
#ifdef CONFIG_QCM_VTLS_FUNC
    QCM_SOCK_SSL_INIT_ERROR = -9,  /*!< SSL initialization error */
    QCM_SOCK_SSL_CONN_ERROR = -10, /*!< SSL connection error */
#endif
} qcm_sock_err_code;

应用示例

TCP_Client

非阻塞连接

请查看 https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/network/network_protocol/socket/tcp_noblock_client.c

阻塞连接

请查看 https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/network/network_protocol/socket/tcp_block_client.c

TCP_Server

请查看 https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/network/network_protocol/socket/tcp_server.c