基于LWIP协议栈net Conn方法,如何创建TCP服务器?附成功代码
本文以 LWIP 轻量级协议栈为核心,详细解析了嵌入式系统中 TCP 服务器的构建方法。通过 Netconn API 分步实现了端口绑定、连接监听、HTTP 数据收发等核心功能,并针对内存管理、错误处理、性能优化等关键问题提供实践建议。代码示例可直接应用于物联网设备通信、工业控制等场景,文中还探讨了多线程扩展、协议解析与安全增强等进阶方向。适合嵌入式开发者快速搭建轻量化网络服务参考。
基于 LWIP 协议栈的 TCP 服务器net Conn方法实现指南(2025年3月18日)
一、LWIP 简介
LWIP(Lightweight IP)是一个专为嵌入式系统设计的开源 TCP/IP 协议栈,其核心特点包括:
- 支持 IPv4/IPv6 协议族
- 提供 RAW/Callback API、Netconn API 等多层接口
- 内存占用低(典型场景仅需 40KB RAM)
- 模块化设计可裁剪特性
以下代码基于 Netconn API 实现了一个支持 HTTP 响应的基础 TCP 服务器。
二、核心代码解析
#include "tcp_server.h"
struct netconn *conn, *newconn; err_t err; // 初始化函数
void tcp_server_init(void)
{
conn = netconn_new(NETCONN_TCP);
if (!conn)
return; // 绑定端口(HTTP 标准端口)
if (netconn_bind(conn, IP_ADDR_ANY, 80) == ERR_OK)
{
netconn_listen(conn); // 进入监听模式
}
} // 任务处理函数
void tcp_server_task(void)
{
if (netconn_accept(conn, &newconn) == ERR_OK)
{
struct netbuf *buf; while (netconn_recv(newconn, &buf) == ERR_OK)
{
void *data;
u16_t len;
if (netbuf_data(buf, &data, &len) == ERR_OK)
{ // 发送 HTTP 响应(带 HTML 内容)
const char *response = "HTTP/1.1 200 OK\r\nContent-Type:
text/html\r\n\r\n<html><body><h1>Hello,
lwIP!</h1></body></html>";
netconn_write(newconn, response, strlen(response), NETCONN_NOCOPY);
}
netbuf_delete(buf);
}
netconn_close(newconn);
netconn_delete(newconn);
}
}
三、关键实现步骤
-
连接创建
netconn_new(NETCONN_TCP)创建 TCP 类型连接对象,需检查返回值是否为 NULL。 -
端口绑定
IP_ADDR_ANY表示绑定到所有本地接口,端口号 80 为 HTTP 服务标准端口。 -
监听模式
通过netconn_listen()进入被动监听状态,支持最大并发数由TCP_LISTEN_BACKLOG定义(默认 0xFF)。 -
连接处理
netconn_accept()会阻塞直到新连接到达,实际项目中建议在独立线程中运行。 -
数据收发
使用netconn_recv()接收数据,netconn_write()发送响应,NETCONN_NOCOPY标志避免内存拷贝提升性能。
四、注意事项
-
内存管理
- 每次接收数据后必须调用
netbuf_delete() - 关闭连接时需依次执行
netconn_close()和netconn_delete()
- 每次接收数据后必须调用
-
错误处理
建议添加以下错误检测:if (err != ERR_OK) { printf("Error code: %d\n", err); netconn_delete(conn); return; } -
性能优化
- 启用
LWIP_SO_RCVTIMEO设置接收超时 - 使用
TCP_WND调整窗口大小(默认 4*TCP_MSS) - 通过
sys_thread_new()创建独立服务线程
- 启用
五、扩展应用方向
-
多连接并发
通过线程池或状态机实现同时处理多个连接 -
协议解析
添加 HTTP 请求解析模块,支持 GET/POST 方法处理 -
安全增强
集成 TLS 加密层(需启用 LWIP_ALTCP 和 mbedTLS)
测试建议
使用telnet 192.168.1.x 80进行基础测试,或通过 Postman 发送标准 HTTP 请求验证服务。
本实现可作为智能家居控制、工业传感器数据采集等嵌入式场景的通信基础模块。完整项目建议参考 lwIP 官方 contrib 包中的示例代码。
附本实验已验证代码:
【免费】F407ZET6-TCP-UDP-With-OS-OK资源-CSDN文库
更多推荐



所有评论(0)