基于 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); 
    } 
}

三、关键实现步骤


  1. 连接创建
    netconn_new(NETCONN_TCP) 创建 TCP 类型连接对象,需检查返回值是否为 NULL。

  2. 端口绑定
    IP_ADDR_ANY 表示绑定到所有本地接口,端口号 80 为 HTTP 服务标准端口。

  3. 监听模式
    通过 netconn_listen() 进入被动监听状态,支持最大并发数由 TCP_LISTEN_BACKLOG 定义(默认 0xFF)。

  4. 连接处理
    netconn_accept() 会阻塞直到新连接到达,实际项目中建议在独立线程中运行。

  5. 数据收发
    使用 netconn_recv() 接收数据,netconn_write() 发送响应,NETCONN_NOCOPY 标志避免内存拷贝提升性能。


四、注意事项

  1. 内存管理

    • 每次接收数据后必须调用 netbuf_delete()
    • 关闭连接时需依次执行 netconn_close() 和 netconn_delete()
  2. 错误处理
    建议添加以下错误检测:

    if (err != ERR_OK) 
    { 
        printf("Error code: %d\n", err); 
        netconn_delete(conn); 
        return; 
    }
  3. 性能优化

    • 启用 LWIP_SO_RCVTIMEO 设置接收超时
    • 使用 TCP_WND 调整窗口大小(默认 4*TCP_MSS)
    • 通过 sys_thread_new() 创建独立服务线程

五、扩展应用方向

  1. 多连接并发
    通过线程池或状态机实现同时处理多个连接

  2. 协议解析
    添加 HTTP 请求解析模块,支持 GET/POST 方法处理

  3. 安全增强
    集成 TLS 加密层(需启用 LWIP_ALTCP 和 mbedTLS)

测试建议
使用 telnet 192.168.1.x 80 进行基础测试,或通过 Postman 发送标准 HTTP 请求验证服务。

本实现可作为智能家居控制、工业传感器数据采集等嵌入式场景的通信基础模块。完整项目建议参考 lwIP 官方 contrib 包中的示例代码。

附本实验已验证代码:
【免费】F407ZET6-TCP-UDP-With-OS-OK资源-CSDN文库

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐