外观
TCP 服务端示例
2026-05-27
概述
本文介绍如何在 睿擎工业开发平台 中创建并运行 TCP 服务端 示例工程。通过基于标准 POSIX Socket 接口的实现,演示了服务器绑定端口、监听连接、接收客户端数据及自动回复消息的完整流程。
TCP 服务器简介
TCP 服务器(TCP Server) 是网络通信中的被动接收方,通过监听指定的端口号,等待客户端的连接请求。一旦建立连接,服务器即可实现与客户端的双向通信。在嵌入式系统中,TCP 服务器常用于作为数据汇聚点,收集多个传感器终端的数据,或作为远程控制中心响应客户端的配置指令。
引脚连接
为保证代码与实际操作一致,本示例在 TL3576-EVM 开发板上,请使用网线将主机与开发板连接起来:

构建与烧录
创建工程点击展开
依次点击 “文件” -> “新建” -> "RT-Thread RuiChing App 项目"。

在弹出新建向导中选择 开发版 、BSP: 、示例 、 调试器/下载器。选择好之后点击 “完成”。

点击 “完成” 后,等待工程创建完成。

创建完成。

构建工程点击展开
单击工程使工程进入 Active-Debug 模式。

点击工具栏上的构建按钮进行工程编译。

构建成功后,会显示构建成功的信息。

固件下载点击展开
固化驱动

固化 APP

核心示例代码
- 套接字初始化与绑定
其中,INADDR_ANY 使服务器监听所有网络接口,listen(10) 表示最多允许 10 个待接受连接。
tcpserver_example.c
if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) //创建 TCP 套接字
{
rt_kprintf("Create socket error\n");
goto __exit;
}
// 设置套接字选项
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(_port);
server_addr.sin_addr.s_addr = INADDR_ANY;
rt_memset(&(server_addr.sin_zero), 0x0, sizeof(server_addr.sin_zero));
// 绑定套接字
if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == [!code warning]
-1) [!code warning]
{
rt_kprintf("Unable to bind\n");
goto __exit;
}
if (listen(sock, 10) == -1) // 开始监听
{
rt_kprintf("Listen error\n");
goto __exit;
}
rt_kprintf("\nTCPServer Waiting for client on port %d...\n", _port);- 等待客户端连接
通过 select 实现非阻塞 IO,避免线程因等待连接而长时间阻塞。
tcpserver_example.c
while (_is_running)
{
FD_ZERO(&readset);
FD_SET(sock, &readset);
rt_kprintf("Waiting for a new connection...");
if (select(sock + 1, &readset, RT_NULL, RT_NULL, &timeout) == 0) // 等待客户端连接
{
continue;
}
connected = accept(sock, (struct sockaddr *)&client_addr, &sin_size);// 接受客户端连接
if (connected < 0)
{
rt_kprintf("accept connection failed! errno = %d", errno);
continue;
}
}- 数据收发
数据处理流程:
- 使用
select()监听客户端套接字connected的数据到达; recv()接收数据并添加字符串终止符;- 根据数据内容执行不同逻辑;
- 向客户端发送固定响应
send_data。
tcpserver_example.c
while (_is_running)
{
FD_ZERO(&readset_c);
FD_SET(connected, &readset_c);
if (select(connected + 1, &readset_c, RT_NULL, RT_NULL, &timeout) == // 等待客户端数据
0)
{
continue;
}
bytes_received = recv(connected, recv_data, BUFSZ, 0); // 接受数据
if (bytes_received < 0)
{
rt_kprintf("Received error, close the connect.\n");
closesocket(connected);
connected = -1;
break;
}
else if (bytes_received == 0)
{
rt_kprintf("Received warning, recv function return 0.\n");
continue;
}
else
{
recv_data[bytes_received] = '\0';
if (strcmp(recv_data, "q") == 0 || strcmp(recv_data, "Q") == 0)
{
rt_kprintf("Got a 'q' or 'Q', close the connect.\n");
closesocket(connected);
connected = -1;
break;
}
else if (strcmp(recv_data, "exit") == 0)
{
closesocket(connected);
connected = -1;
goto __exit;
}
else
{
rt_kprintf("Received data = %s\n", recv_data);
}
}
ret = send(connected, send_data, rt_strlen(send_data), 0); // 发送固定响应
if (ret < 0)
{
rt_kprintf("send error, close the connect.\n");
closesocket(connected);
connected = -1;
break;
}
else if (ret == 0)
{
rt_kprintf("Send warning, send function return 0.\n");
}
}运行示例
操作步骤
- 将程序下载到开发板
- 打开串口终端连接开发板
- 配置开发板网络
- 启动服务器程序
- 输入
tcpserver_example命令
步骤 1:查看服务器 IP
在 windows cmd 中执行 ifconfig 命令,查看本机的 IP 地址、子网掩码及默认网关信息。
C:\Users\RTT>ipconfig
Windows IP 配置
以太网适配器 以太网 2:
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::cf98:15ca:965f:56b1%10
IPv4 地址 . . . . . . . . . . . . : 192.168.1.2
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 192.168.1.1步骤 2:设置开发板 IP
在串口调试助手中,通过命令行 ifconfig e0 192.168.1.3 192.168.1.1 255.255.255.0 设置开发板的 IP 地址、默认网关和子网掩码,确保其与本机 IP 处于同一网段且网络配置一致。
msh />ifconfig e0 192.168.1.3 192.168.1.1 255.255.255.0
config : e0
IP addr: 192.168.1.3
Gateway: 192.168.1.1
netmask: 255.255.255.0步骤 3:启动服务器
启动服务器程序后,将其 IP 设置为本机 IP 并配置端口号,然后开启连接监听。

步骤 4:启动客户端
输入命令:tcpserver_example 5001,启动 TCP 服务器,然后开启连接监听。
预期结果:
成功建立连接后,服务器能接收客户端发送的数据并回复固定消息。
RT-Thread 终端
msh />tcpserver_example 5001 \[I/TCP] Waiting for a new connection...
[I/TCP] Waiting for a new connection...
[I/TCP] Waiting for a new connection...
[I/TCP] Waiting for a new connection...
[I/TCP] Waiting for a new connection...
[I/TCP] Waiting for a new connection...
[I/TCP] Waiting for a new connection...
[I/TCP] Waiting for a new connection...
[I/TCP] Waiting for a new connection...
[I/TCP] I got a connection from (192.168.1.2 , 51115)
[D/TCP] Received data = 456456
[D/TCP] Received data = 456456
[D/TCP] Received data = 456456sscom
[16:38:27.682]收←◆This is TCP Server from RT-Thread.
[16:38:35.046]发→◇456456
[16:38:35.049]收←◆This is TCP Server from RT-Thread.
[16:38:35.198]发→◇456456
[16:38:35.205]收←◆This is TCP Server from RT-Thread.
[16:38:35.348]发→◇456456
[16:38:35.351]收←◆This is TCP Server from RT-Thread.