lwip协议

article/2025/8/22 23:50:11

LWIP版本号

野火LwIP应用开发实战指南:基于STM32
lwIP 2.1.0 Lightweight IP stack
lwip的版本号在哪个文件里能看到?
关于LWIP几篇不错的文章分享
LwIP应用开发实战指南
LwIP多TCP连接问题
lwIP TCP/IP 协议栈笔记之十: LwIP 数据流框架
wireshark过滤表达式&wireshark捕获ftp协议分析

0.0 LWIP使用问题

Atmel AT04055: Using the lwIP Network Stack
Small TCP/IP stacks for micro controllers - Universiteit Twente
Huawei Lite OS Lw IP Developer Guide - UserManual.wiki
Developing applications on STM32Cube with LwIP TCP/IP stack
LWIP会卡在netconn_write
关于LWIP在应用中遇到的一个问题memp_malloc: out of memory in pool TCP_PCB

0.1 TCP

TCP连接的部分细节及边界情况分析
一个完整的TCP连接
服务端主动终止连接的情况分析
TCP包的seq和ack号计算方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

0.2 Modbus-TCP

一次Modbus-TCP数据读取过程
在这里插入图片描述

/**
* @brief  modbus-tcp 初始化
* @note
* @param
* @retval None
*/
void MODBUS_TCP_init( void )
{eMBDisable();eMBTCPInit( lan_para.modbus_tcp_port );/**启动FreeModbus*/eMBEnable();if ( g_modbus_tcp_task_handle ){osThreadTerminate( g_modbus_tcp_task_handle );}/* Create the Modbus Process handler thread */osThreadDef( ModbusTcpServerConn, MODBUS_TCP_server_conn, osPriorityNormal, 0, 128 );g_modbus_tcp_task_handle = osThreadCreate( osThread( ModbusTcpServerConn ), NULL );
}/*** @brief    MODBUS_TCP_server_conn*           MODBUS_TCP 服务器监听任务* @param    arg 任务参数* @return   void
*/
static void MODBUS_TCP_server_conn( void const *arg )
{struct netconn *conn, *newconn;err_t err;/* 创建一个TCP连接 */conn = netconn_new( NETCONN_TCP );if ( conn != NULL ){/* 绑定modbus端口号 */err = netconn_bind( conn, IP_ADDR_ANY, lan_para.modbus_tcp_port );if ( err == ERR_OK ){/* 进入监听模式 */netconn_listen_with_backlog(conn,0);
//      netconn_listen( conn );while ( 1 ){/* 阻塞,直到有modbus tcp 连接请求 */err = netconn_accept( conn, &newconn );if ( err == ERR_OK ){if(MODBUS_TCP_conn_count<2){/* 连接成功,创建新的线程处理modbus tcp连接请求 */osThreadDef( ModbusProcessTask, MODBUS_process_task, osPriorityHigh, 0, 500 );osThreadCreate( osThread( ModbusProcessTask ), newconn );}else{netconn_close( newconn );netconn_delete( newconn );}}}}}
}/*** @brief  MODBUS TCP处理程序。* @note   MODBUS TCP处理程序* @param  None* @retval None*/
void MODBUS_process_task( void const *arg )
{struct netconn *conn;struct netbuf *buf;err_t  accept_err;err_t err;void *data;u16_t len;LWIP_UNUSED_ARG( arg );MODBUS_TCP_conn_count++;/* 当前控制端口连接 */conn = ( struct netconn * )arg;/* 开启连接保活检测 */ip_set_option( conn->pcb.tcp, SOF_KEEPALIVE );/* 阻塞,直到接收数据 */while ( netconn_recv( conn, &buf ) == ERR_OK ){do{/* 提取数据指针 */netbuf_data( buf, ( void ** )&data, &len );if ( lan_para.modbus_tcp_enable ){if ( len > MB_TCP_BUF_SIZE ){ucTCPRequestLen = MB_TCP_BUF_SIZE;memcpy( ucTCPRequestFrame, data, ucTCPRequestLen );}else{ucTCPRequestLen = len;memcpy( ucTCPRequestFrame, data, ucTCPRequestLen );}//              MY_DEBUG_LOG("MODBUS_process_task free stack size : %u\n",(int32_t)uxTaskGetStackHighWaterMark(NULL));
//              osDelay(10);/* 向 modbus poll发送消息 */xMBPortEventPost( EV_FRAME_RECEIVED );eMBPoll();err = netconn_write( conn, pucTCPResponseFrame, ucTCPResponseLen, NETCONN_COPY);if( ERR_OK != err ){MY_DEBUG_LOG( "netconn_write err : %u\n", err );}}}while( netbuf_next( buf ) >= 0 );netbuf_delete( buf );}MODBUS_TCP_conn_count--;netbuf_delete( buf );/* Close connection and discard connection identifier. */netconn_close( conn );netconn_delete( conn );vTaskDelete( NULL ); /* 断开连接时,删除自己 */
}

🥥 1 设置主机名称


https://blog.csdn.net/weixin_39270987/article/details/112393250

🔥 2 编程API


https://blog.csdn.net/qq_33559992/article/details/112616178?l

STM32每个系列都会有唯一的一个芯片序列号(96位bit):

            STM32F10X 的地址是 0x1FFFF7E8 STM32F20X 的地址是 0x1FFF7A10STM32F30X 的地址是 0x1FFFF7ACSTM32F40X 的地址是 0x1FFF7A10STM32L1XX 的地址是 0x1FF80050

芯片STM32F207

#define STM32_SERIAL0 (*(__IO uint32_t ) 0x1fff7a10)
#define STM32_SERIAL1 (
(__IO uint32_t ) 0x1fff7a14)
#define STM32_SERIAL2 (
(__IO uint32_t *) 0x1fff7a18)
读取96位的芯片ID,
MAC地址的第1字节的第8Bit(00-50-BA-…对应的00000000-01010000-10111010-…,加粗字体的Bit)标识这个地址是组播地址还是单播地址,0单播,1组播
uint32 McuSerNo[2],tmp[2];
uint8 MacAdress[6];
McuSerNo[0] = STM32_SERIAL0;
McuSerNo[1] = STM32_SERIAL1;
tmp[0] = McuSerNo[0] << 2 ;
tmp[1] = ((McuSerNo[0] >> 30) & 0x03 ) + (McuSerNo[1] << 2) & 0xfffffffc;

memcpy(MacAdress,tmp,6);

🀄3 MAC地址格式规定第一个字节为偶数(MAC地址16进制中的第一个字节第二个数一定是偶数)

在TCP/IP的架构中,MAC地址扮演着非常重要的角色。在通信中,由MAC地址标识的主机网卡,作为主机身份的硬件地址。每块网卡被生产出来后,都会有一个全球唯一的编号来标识自己,不会重复,这个编号就是MAC地址,也就是网卡的物理地址。MAC地址是由48位的二进制数组成,即6个字节。在通信中是用16进制表示的。前24位是由生产厂家向IEEE标准组织申请的厂家代码,是固定的,但是它的第八位一定是0(48位中的第8位二进制数),因为网卡的物理地址,一定是单播地址,在IPv4的环境中,区分单播和组播地址就是校检第八位的二进制数字,0代表单播地址,1代表组播地址。那么表现在16进制中第一字节第二个数字一定是个偶数(十进制概念,不知道恰不恰当)。也就是说第二个数字一定是0、2、4、6、8、A、C、E其中的一个,那么区分单播或者组播地址就简单多了。
例:6C-62-6D-26-1E-29 它的二进制:

01101100-01100010-01101101-00100110-00011110-00101001 单播:第八位为0

如果你将MAC改为:61-62-6D-26-1E-29,这样的地址是组播地址,修改不会成功。

注:我们在写程序随机生成MAC地址时,切记MAC地址16进制中的第一个字节第二个数一定是偶数。

4 TFTP

TFTP服务器的文件上传和下载速度有1MB/S左右,比FTP服务器要慢一半
理论上来说UDP传输速率会大于TCP,主要是因为TCP传输存在慢启动和用塞避免。当网络中存在冲突的时候,会大幅的降低传输速度,这个时候UDP就是抢占上来,而TCP会越来越慢。
虽然tftp是基于UDP的,ftp是基于tcp的,但是tftp的传输速度远不及tfp。tftp采用的是简单的停止等待协议,发出去的UDP包必须要等待对方的回答或者超时才能开始下一个UDP发送或者重传。而FTP只要对方有ACK表示有win空间就可以持续的发,所以FTP要比TFTP快很多。
在这里插入图片描述

5 超时设置

LwIP上的SO_RCVTIMEO选项
Netconn receive timeout
LWIP + RTOS - 如何避免netconn永远阻塞线程?
开启连接保活(用于断网,客户端死机等问题)
TCP_TMR_INTERVAL的值会影响保活超时的时间,TCP_TMR_INTERVAL的值越大,需要的时间越长。
如果超过规定时间没有返回ACK,则netconn_recv会返回错误代码ERR_ABRT,此时可断开连接,清除占用的内存,退出任务。

#define LWIP_TCP_KEEPALIVE              1
#define TCP_KEEPIDLE_DEFAULT            5000UL//7200000UL /* Default KEEPALIVE timer in milliseconds */  
#define TCP_KEEPINTVL_DEFAULT           1000UL//75000UL   /* Default Time between KEEPALIVE probes in milliseconds */
#define TCP_KEEPCNT_DEFAULT             5U//9U        /* Default Counter for KEEPALIVE probes *//* 创建一个TCP连接 */conn = netconn_new( NETCONN_TCP );if ( conn != NULL ){/* 开启连接保活检测 */ip_set_option( conn->pcb.tcp, SOF_KEEPALIVE );/* 绑定modbus端口号 */err = netconn_bind( conn, IP_ADDR_ANY, lan_para.modbus_tcp_port );if ( err == ERR_OK ){/* 进入监听模式 */
//      netconn_listen_with_backlog(conn,0);netconn_listen( conn );while ( 1 ){/* 阻塞,直到有modbus tcp 连接请求 */err = netconn_accept( conn, &newconn );if ( accept_err == ERR_OK ){while ( netconn_recv( newconn, &buf ) == ERR_OK ){}netbuf_delete( buf );/* Close connection and discard connection identifier. */netconn_close( newconn );netconn_delete( newconn );}}}}

设置netconn_recv接收超时(用于清除长时间无数据发送的连接)
如果超过规定时间没有接收到数据,则netconn_recv会返回错误代码ERR_TIMEOUT,此时可断开连接,清除占用的内存,退出任务。

/* 开启接收超时功能 */
#define LWIP_SO_RCVTIMEO                1
/* 设置接收超时 */  
netconn_set_recvtimeout(conn,60000);

在这里插入图片描述
在这里插入图片描述

6 内存管理

opt.h
/*** MEM_SIZE: the size of the heap memory. If the application will send* a lot of data that needs to be copied, this should be set high.*/
#if !defined MEM_SIZE || defined __DOXYGEN__
#define MEM_SIZE                        (20*1024)
#endifmem.c
#define MEM_SIZE_ALIGNED     LWIP_MEM_ALIGN_SIZE(MEM_SIZE)
/*----- Default Value for H7 devices: 0x30044000 -----*/
#define LWIP_RAM_HEAP_POINTER 0x30044000
/*** Zero the heap and initialize start, end and lowest-free*/
void
mem_init(void)
{struct mem *mem;LWIP_ASSERT("Sanity check alignment",(SIZEOF_STRUCT_MEM & (MEM_ALIGNMENT - 1)) == 0);/* align the heap */ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER);/* initialize the start of the heap */mem = (struct mem *)(void *)ram;mem->next = MEM_SIZE_ALIGNED;mem->prev = 0;mem->used = 0;/* initialize the end of the heap */ram_end = ptr_to_mem(MEM_SIZE_ALIGNED);ram_end->used = 1;ram_end->next = MEM_SIZE_ALIGNED;ram_end->prev = MEM_SIZE_ALIGNED;MEM_SANITY();/* initialize the lowest-free pointer to the start of the heap */lfree = (struct mem *)(void *)ram;MEM_STATS_AVAIL(avail, MEM_SIZE_ALIGNED);if (sys_mutex_new(&mem_mutex) != ERR_OK) {LWIP_ASSERT("failed to create mem_mutex", 0);}
}

LWIP之Memp原理
LwIP内存分配
LwIP常见问题FAQ(持续更新中…)
lwip编译选项
TCP/IP协议学习(二) LWIP用户自定义配置文件解析
LwIP configuration
LWIP v2.1.0内存管理之相关宏之间的关系
lwip 内存池与内存堆的空间定义

7 netconn

lwIP TCP/IP 协议栈笔记之十六: NETCONN 接口编程

netconn_listen_with_backlog(conn,1);

listen函数中backlog的含义

8 FTP

FTP message format
lwip-FTP
FTP启动时,会创建一个控制连接A和一个数据连接,打开根目录后,数据连接关闭,控制连接A保持。
启动文件下载都会创建一个新的控制连接B和数据发送连接,文件传输完成后,数据连接关闭,控制连接B保持一段时间,如果没有文件传输操作,则关闭控制连接B,如果在可用时间段内,则继续使用控制连接B。
控制连接A用于目录的切换

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

9 socket

《嵌入操作系统 – 玩转ART-Pi开发板》第9章 基于Select/Poll实现并发服务器(二)

dhcp

用wireshark抓包分析DHCP协议!数据报文单播还是多播?
实现lwip的DHCP自动获取ip地址
lwip源码分析 之 DHCP协议实现(一)
在这里插入图片描述


http://chatgpt.dhexx.cn/article/aeh2ZTYN.shtml

相关文章

LWP 与 WEB 的基本使用

简介 LWP (“Library for WWW in Perl” 的缩写) 是一个由多个模块组成&#xff0c;用来获取网络数据的的模块组。 和很多 Perl 的模块一样。每一个 LWP 模块都自带详细的文档&#xff0c;做为对这个模块的完整介绍。可是面对 LWP 里的众多模块&#xff0c;有时候即使是完成最简…

LWIP协议与TCP/IP

1. 学习一个东西&#xff0c;先了解这个东西是干什么用的&#xff0c;哪些场景会用到它&#xff0c;与自己已经掌握的其他知识的联系 a. 例如&#xff1a;LWIP这个东西是干什么用的&#xff1a;他就是一个裁剪后保持大部分TCP/IP功能的协议。用少量的资源消耗实现一个较为完整的…

[Linux]线程概念_线程控制(线程与进程的区别与联系 | 线程创建 | 线程等待 | 线程终止 | 线程分离 | LWP)

文章目录 线程概念进程和线程的关系线程的优点线程的缺点 线程控制Linux线程和接口关系的认识线程创建线程ID及进程地址空间布局线程等待线程终止线程终止状态线程分离LWP和pthread_t 线程概念 线程是在进程内部运行的一个执行分支&#xff08;执行流&#xff09;&#xff0c;…

实现线程的三种方式KLT/ULT/LWP

大家好&#xff0c;我是神韵&#xff0c;是一个技术&生活博主。关于文章都是定位为基础&#xff0c;我不敢讲的太深入&#xff0c;因为我怕自己没时间。欢迎来点赞打卡&#xff0c;你们的行动将是我无限的动力。 今日主题是&#xff1a;实现线程的三种方式KLT/LWP/ULT 三种…

Linux——一文彻底了解进程id和线程id的关系(什么是pid、tgid、lwp、pthread_t)

目录 一.内核层面&#xff1a;pid & tgid 二.函数调用层面&#xff1a;getpid & gettid & pthread_self 三.用户层面&#xff1a;PID & LWP&#xff08;TID&#xff09; 四.总结 一.内核层面&#xff1a;pid & tgid 首先&#xff0c;我们要清楚&#…

LWIP简介

1介绍 lwIP 是 TCP/IP 协议套件的小型独立实现。lwIP TCP/IP 实现的重点是减少 RAM 使用同时仍然有一个完整的 TCP。这使得 lwIP 适合使用在具有数十 KB 可用 RAM 和空间的嵌入式系统中大约 40 KB 的代码 ROM。 lwIP 最初由计算机和网络的 Adam Dunkels 开发瑞典计算机科学研究…

Linux进程、线程模型,LWP,pthread_self()

一&#xff0e;定义 关于进程、轻量级进程、线程、用户线程、内核线程的定义&#xff0c;这个很容易找到&#xff0c;但是看完之后你可以说你懂了&#xff0c;但实际上你真的明白了么&#xff1f; 在现代操作系统中&#xff0c;进程支持多线程。进程是资源管理的最小单元&…

Linux下线程(LWP)的相关概念

一.概念 线程&#xff1a;一个进程内部的控制序列。或者说在一个程序里的一个执行路线 首先明确一个概念&#xff0c;在Linux下是没有进程的控制块的&#xff0c;使用进程模拟的线程。一个进程中至少有一个线程。所以进程跟线程的数量是一对&#xff08;一&#xff09;多的。…

Linux-线程(LWP)

文章目录 线程线程概念进程今天的进程 vs之前的进程私有和共享资源实验验证线程的优点&#xff1a;线程的缺点&#xff1a;线程异常线程的用途&#xff1a; 线程控制创建线程(1)先创建两个线程&#xff1a;链接时要引入第三方库。(2)创建多个线程&#xff1a;(3)线程的健壮性不…

护眼色的RGB值 和 颜色代码

在搜索引擎搜“护眼色”&#xff0c;就会搜出一堆关于保护眼睛的屏幕颜色文章&#xff0c;说的统统是一种颜色&#xff0c;有点像绿豆沙的颜色。方法就是在屏幕设置里。 色调: 85; 饱和度: 123; 亮度: 205; R: 199; G: 237; B: 204; 颜色代码是&#xff1a; #…

护眼绿RGB值

网上流行护眼色的RGB值分别为&#xff1a; R: 204 G: 232 B: 207 以matlab R2017b &#xff0c;设置背景色为护眼绿 为例&#xff1a; 预设——>颜色——> 取消勾选 使用系统颜色——> 背景——>RGB——> RGB依次输入 204&#xff0c; 232&#xff0c; 207—…

护眼参数设置

2019独角兽企业重金招聘Python工程师标准>>> 一、护眼背景色参数 柔和的豆沙绿&#xff1a; 色调&#xff1a;85 饱和度&#xff1a;123 亮度&#xff1a;205 对眼睛有益的RGB数值分别是&#xff08;199,237,204&#xff09; 二、eclipse左侧背景色设置 这是跟系统设…

Win10如何设置护眼色

https://blog.csdn.net/xiao297328/article/details/79888156 效果图&#xff1a; 在cmd中输入regedit 重启电脑即可

pdf阅读器修改背景颜色 护眼色

1&#xff0c; pdf and word setting 护眼色 586 3215 1586155 RGB: 170, 207, 184 2&#xff0c; 福昕阅读器设置 3 adobe acrobat

eclipse设置护眼色(一劳永逸)

无需在eclipse中设置&#xff0c;避免切换工作空间后失效。 第一步&#xff1a;首先使用 Win R 组合快捷键&#xff0c;打开“运行”&#xff0c;然后键入打开注册表命令regedit&#xff0c;按回车键确认打开。 第二步&#xff1a;打开注册表之后&#xff0c;依次在左侧树状菜…

vscode调教界面为护眼色

第1步&#xff1a;在vscode上安装主题插件Atom One Light Theme 在扩展商店里输入atom关键词&#xff08;或者直接输入全&#xff09;&#xff0c; 找到如下对应的插件安装并使用 确认使用&#xff08;如果没有更改过快捷键&#xff0c;那么ctrl按住不放&#xff0c;再依次按…

word设置背景色为护眼的绿色

word 2019设置背景色为护眼的绿色 原创不易&#xff0c;路过的各位大佬请点个赞 步骤一 新建一个word空白文档。 步骤二、 依次点开“设计-页面颜色”&#xff0c;选择自己想要的背景色。一般豆沙绿的参数是&#xff1a;红&#xff1a;202&#xff0c;绿&#xff1a;234&…

idea常用护眼色的RGB值调整

1.保护眼睛颜色的RGB数值 银河白 #FFFFFF RGB(255, 255, 255)杏仁黄 #FAF9DE RGB(250, 249, 222)秋叶褐 #FFF2E2 RGB(255, 242, 226)胭脂红 #FDE6E0 RGB(253, 230, 224)青草绿 #E3EDCD RGB(227, 237, 205)海天蓝 #DCE2F1 RGB(220, 226, 241)葛巾…

eclispe 护眼色设置

1.Eclipse字体大小调整&#xff1a; 窗口(Window)-首选项&#xff08;Preferences&#xff09;-> General&#xff09;-> Appearence -> Colors And Fonts -> Java -> Java Editor Text Font -> Change : 2.Eclipse xml和jsp文件字体大小调整&#x…

eclipse 护眼色设置

1 调整eclipse editor区域背景色 背景颜色向你推荐&#xff1a;色调&#xff1a;85。饱和度&#xff1a;1 2 3。亮度&#xff1a;2 0 5 文档都不再是刺眼的白底黑字&#xff0c;而是非常柔和的豆沙绿色&#xff0c;这个色调是眼科专家配置的&#xff0c;长时间使用会很有效的…