当前位置: 首页 > news >正文

【STM32】 TCP/IP通信协议(3)--LwIP网络接口

        LwIP协议栈支持多种不同的网络接口(网卡),由于网卡是直接跟硬件平台打交道,硬件不同则处理也是不同。那Iwip如何兼容这些不同的网卡呢?

        LwIP提供统一的接口,底层函数需要用户自行完成,例如网卡的初始化、接收和发送数据等。当LwIP底层接收到网络数据时,需要经过层层递交才会传入内核处理;相反,LwIP发送数据时也会调用网卡的发送数据。对于没有接触过LwIP的人新手来说,我们如何编写这个底层代码呢?不用担心,LwIP提供了一个ethernetif.c 文件作为底层接口的驱动模版。用户只根据自己的网络设备进行参照修改即可。

        在LwIP中,netif数据结构用于描述一个网络接口的特性。这个结构体是在netif.h文件中定义的

struct netif {/* 指向下一个 netif 结构的指针 */struct netif *next;/* IP 地址相关配置 */ip_addr_t ip_addr; /* 网络接口的 IP 地址 */ip_addr_t netmask; /* 子网掩码 */ip_addr_t gw; /* 网关地址 *//* 该函数向 IP 层输入数据包 */netif_input_fn input;/* 该函数发送 IP 包 */netif_output_fn output;/* 该函数实现底层数据包发送 */netif_linkoutput_fn linkoutput;/* 该字段用户可以自由设置,例如用于指向一些底层设备相关的信息 */void *state;
void* client_data[LWIP_NETIF_CLIENT_DATA_INDEX_MAX + 
LWIP_NUM_NETIF_CLIENT_DATA];
​/* 该接口允许的最大数据包长度 */u16_t mtu;/* 该接口物理地址长度 */u8_t hwaddr_len;/* 该接口的物理地址 */u8_t hwaddr[NETIF_MAX_HWADDR_LEN];/* 该接口的状态、属性字段 */u8_t flags;/* 该接口的名字 */char name[2];/* 接口的编号 */u8_t num;/* 需要发送的路由器请求消息的数量 */u8_t rs_count;
};

这些字段用于描述各个网卡的差异,每个网卡都通过一个 netif 结构体进行抽象表示。多 个网卡对应多个 netif,这些 netif 以链表的形式链接起来,形成一个单向链表。

这个链表的首个节点由 netif_list 指针指向,lwIP 内核使用该指针遍历和查询 netif 链表。

struct netif *netif_list; /* 网络接口链表指针 */
struct netif *netif_default; /* 哪个网络接口(多网口时候) */
static u8_t netif_num; /* 为网口分配唯一标识 */

在 lwIP 中,netif.c 文件包含了管理网络接口的核心函数。其中,netif_default 指针指向默 认的网络接口,当网络层需要发送数据包时,系统优先选择该指针所指向的网卡进行数据发送。 如果该网卡没有响应,则会选择其他网卡进行发送

1.netif_add 函数

该函数用于将新创建的 netif 插入到 netiflist 队列中,以表示添加了一个网络接口。

struct netif *
netif_add( struct netif *netif,const ip4_addr_t *ipaddr, const ip4_addr_t *netmask,
const ip4_addr_t *gw,void *state, netif_init_fn init, netif_input_fn input)
{/* 清空主机 IP 地址、子网掩码、网关等信息。 */ip_addr_set_zero_ip4(&netif->ip_addr);ip_addr_set_zero_ip4(&netif->netmask);ip_addr_set_zero_ip4(&netif->gw);netif->output = netif_null_output_ip4;/* 传输的最大数据长度 */netif->mtu = 0;/* 网络的接口状态 */netif->flags = 0;memset(netif->client_data, 0, sizeof(netif->client_data));/* 传递进来的参数填写网卡 state、input 等字段的相关信息 */netif->state = state;/* 并为当前网卡 分配唯一标识 num */netif->num = netif_num;/* 网卡输入 */netif->input = input;/* 调用网卡设置函数 netif_set_addr()设置网卡 IP 地址、子网掩码、网关 */netif_set_addr(netif, ipaddr, netmask, gw);/* 为 netif 调用用户指定的初始化函数 */if (init(netif) != ERR_OK) {return NULL;}/* 将这个 netif 添加到列表中 */netif->next = netif_list;netif_list = netif;mib2_netif_added(netif);netif_invoke_ext_callback(netif, LWIP_NSC_NETIF_ADDED, NULL);return netif;
}

每一个 netif 结构体是对一个网卡进行抽象,包含了该网 卡的收发函数、状态等信息。

注:新插入的 netif 结构体是在 netiflist 队列的首部插入

2.netif_set_default 函数

该函数用于将指定的 netif 结构体设置为默认网卡,使 lwIP 内核优先对该网卡进行操作。

void
netif_set_default(struct netif *netif)
{if (netif == NULL){/* 删除默认路由 */mib2_remove_route_ip4(1, netif);}else{/* 添加默认路由 */mib2_add_route_ip4(1, netif);}netif_default = netif; /* 选择那个网络接口 */
}/*********************怎么使用函数 netif_set_default()*********************/
/* 通过该函数,将网络接口添加到链表中 */
netif_add(&xnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init,&tcpip_input);/* 注册默认的网络接口 */
netif_set_default(&xnetif);

        调用该函数,可以设置指定的网络接口为默认网卡。在函数内部,会更新相应的默认 网卡指针,并确保后续的网络操作优先使用该网卡进行数据传输。

相关文章:

【STM32】 TCP/IP通信协议(3)--LwIP网络接口

LwIP协议栈支持多种不同的网络接口(网卡),由于网卡是直接跟硬件平台打交道,硬件不同则处理也是不同。那Iwip如何兼容这些不同的网卡呢? LwIP提供统一的接口,底层函数需要用户自行完成,例如网卡的…...

15分钟学 Python 第39天:Python 爬虫入门(五)

Day 39:Python 爬虫入门数据存储概述 在进行网页爬虫时,抓取到的数据需要存储以供后续分析和使用。常见的存储方式包括但不限于: 文件存储(如文本文件、CSV、JSON)数据库存储(如SQLite、MySQL、MongoDB&a…...

使用Pytorch构建自定义层并在模型中使用

使用Pytorch构建自定义层并在模型中使用 继承自nn.Module类,自定义名称为NoisyLinear的线性层,并在新模型定义过程中使用该自定义层。完整代码可以在jupyter nbviewer中在线访问。 import torch import torch.nn as nn from torch.utils.data import T…...

学习记录:js算法(五十六):从前序与中序遍历序列构造二叉树

文章目录 从前序与中序遍历序列构造二叉树我的思路网上思路 总结 从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示…...

qt使用QDomDocument读写xml文件

在使用QDomDocument读写xml之前需要在工程文件添加: QT xml 1.生成xml文件 void createXml(QString xmlName) {QFile file(xmlName);if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate |QIODevice::Text))return false;QDomDocument doc;QDomProcessin…...

Oracle架构之表空间详解

文章目录 1 表空间介绍1.1 简介1.2 表空间分类1.2.1 SYSTEM 表空间1.2.2 SYSAUX 表空间1.2.3 UNDO 表空间1.2.4 USERS 表空间 1.3 表空间字典与本地管理1.3.1 字典管理表空间(Dictionary Management Tablespace,DMT)1.3.2 本地管理方式的表空…...

springboot整合seata

一、准备 docker部署seata-server 1.5.2参考&#xff1a;docker安装各个组件的命令 二、springboot集成seata 2.1 引入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId>&…...

鸿蒙开发(NEXT/API 12)【二次向用户申请授权】程序访问控制

当应用通过[requestPermissionsFromUser()]拉起弹框[请求用户授权]时&#xff0c;用户拒绝授权。应用将无法再次通过requestPermissionsFromUser拉起弹框&#xff0c;需要用户在系统应用“设置”的界面中&#xff0c;手动授予权限。 在“设置”应用中的路径&#xff1a; 路径…...

docker export/import 和 docker save/load 的区别

Docker export/import 和 docker save/load 都是用于容器和镜像的备份和迁移&#xff0c;但它们有一些关键的区别&#xff1a; docker export/import: export 作用于容器&#xff0c;import 创建镜像导出的是容器的文件系统&#xff0c;不包含镜像的元数据丢失了镜像的层级结构…...

明星周边销售网站开发:SpringBoot技术全解析

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…...

STM32+ADC+扫描模式

1 ADC简介 1 ADC(模拟到数字量的桥梁) 2 DAC(数字量到模拟的桥梁)&#xff0c;例如&#xff1a;PWM&#xff08;只有完全导通和断开的状态&#xff0c;无功率损耗的状态&#xff09; DAC主要用于波形生成&#xff08;信号发生器和音频解码器&#xff09; 3 模拟看门狗自动监…...

R语言绘制散点图

散点图是一种在直角坐标系中用数据点直观呈现两个变量之间关系、可检测异常值并探索数据分布的可视化图表。它是一种常用的数据可视化工具&#xff0c;我们通过不同的参数调整和包的使用&#xff0c;可以创建出满足各种需求的散点图。 常用绘制散点图的函数有plot()函数和ggpl…...

安装最新 MySQL 8.0 数据库(教学用)

安装 MySQL 8.0 数据库&#xff08;教学用&#xff09; 文章目录 安装 MySQL 8.0 数据库&#xff08;教学用&#xff09;前言MySQL历史一、第一步二、下载三、安装四、使用五、语法总结 前言 根据 DB-Engines 网站的数据库流行度排名&#xff08;2024年&#xff09;&#xff0…...

微信小程序开发-配置文件详解

文章目录 一&#xff0c;小程序创建的配置文件介绍二&#xff0c;配置文件-全局配置-pages 配置作用&#xff1a;注意事项&#xff1a;示例&#xff1a; 三&#xff0c;配置文件-全局配置-window 配置示例&#xff1a; 四&#xff0c;配置文件-全局配置-tabbar 配置核心作用&am…...

TCP/UDP初识

TCP是面向连接的、可靠的、基于字节流的传输层协议。 面向连接&#xff1a;一定是一对一连接&#xff0c;不能像 UDP 协议可以一个主机同时向多个主机发送消息 可靠的&#xff1a;无论的网络链路中出现了怎样的链路变化&#xff0c;TCP 都可以保证一个报文一定能够到达接收端…...

【大数据】在线分析、近线分析与离线分析

文章目录 1. 在线分析&#xff08;Online Analytics&#xff09;定义特点应用场景技术栈 2. 近线分析&#xff08;Nearline Analytics&#xff09;定义特点应用场景技术栈 3. 离线分析&#xff08;Offline Analytics&#xff09;定义特点应用场景技术栈 总结 在线分析&#xff…...

【unity进阶知识9】序列化字典,场景,vector,color,Quaternion

文章目录 前言一、可序列化字典类普通字典简单的使用可序列化字典简单的使用 二、序列化场景三、序列化vector四、序列化color五、序列化旋转Quaternion完结 前言 自定义序列化的主要原因&#xff1a; 可读性&#xff1a;使数据结构更清晰&#xff0c;便于理解和维护。优化 I…...

传奇GOM引擎架设好进游戏后提示请关闭非法外挂,重新登录,如何处理?

今天在架设一个GOM引擎的版本时&#xff0c;进游戏之后刚开始是弹出一个对话框&#xff0c;提示请关闭非法外挂&#xff0c;重新登录&#xff0c;我用的是绿盟登陆器&#xff0c;同时用的也是绿盟插件&#xff0c;刚开始我以为是绿盟登录器的问题&#xff0c;于是就换成原版gom…...

OpenCV视频I/O(15)视频写入类VideoWriter之标识视频编解码器函数fourcc()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将 4 个字符拼接成一个 FourCC 代码。 在 OpenCV 中&#xff0c;fourcc() 函数用于生成 FourCC 代码&#xff0c;这是一种用于标识视频编解码器的…...

rust log选型

考察了最火的tracing。但是该模块不支持compact&#xff0c;仅支持根据时间进行rotate。 daily Creates a daily-rotating file appender. hourly Creates an hourly-rotating file appender. minutely Creates a minutely-rotating file appender. This will rotate the log…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...

FTXUI::Dom 模块

DOM 模块定义了分层的 FTXUI::Element 树&#xff0c;可用于构建复杂的终端界面&#xff0c;支持响应终端尺寸变化。 namespace ftxui {...// 定义文档 定义布局盒子 Element document vbox({// 设置文本 设置加粗 设置文本颜色text("The window") | bold | color(…...