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

正点原子lwIP学习笔记——NETCONN接口简介

1. NETCONN接口简介

NETCONN API 使用了操作系统的 IPC 机制, 对网络连接进行了抽象,使用同一的接口完成UDP和TCP连接。
NETCONN调用流程
NETCONN API接口是在RAW接口基础上延申出来的一套API接口

NETCONN调用流程
首先会调用netconn_new创建一个pcb控制块,其实际是一个宏定义,调用了netconn_new_with_proto_and_callback函数;其就是先定义了一个netconn的结构体conn,然后通过netconn_alloc申请内存,并通过netconn_apimsg构建一个API消息;

netconn_apimsg,在里面就是调用tcpip_send_msg_wait_sem;这个函数中,显示构建了一系列消息的初始化,然后调用sys_mbox_post发送邮箱;

当然以上所述,是需要通过宏定义修改才能实现的,lwIP内核默认是直接调用RAW,而不需要API消息;如果是默认方式,那么就会直接调用,也就是直接通过lwip_netconn_do_newconn函数执行;该函数中构建了一个api_msg结构体的指针msg,然后只要msg->conn->pcb.tcp为空,就调用peb_new创建内存;这其中会根据宏定义,判断是UDP还是TCP

UDP就会调用udp_new_ip_type,里面调用udp_new进行创建pcb控制块;创建完成后,会调用udp_recv构建udp的recv回调函数,这里的回到函数就不需要像RAW接口一样自己编写了;lwIP已经实现了recv_udp,里面创建流程跟之前讲的很像,调用memp_malloc创建内存给netbuf结构体buf,然后初始化buf的参数,比如p和ptr指针,还有IP地址和端口号;最重要的就是调用sys_mbox_trypost发送邮箱给tcp线程,然后会把当前pbuf的指针发送出去

2. NETCONN实现原理

NETCONN控制块

netconn控制块
这里比较好用的是union这个联合体,在里面定义了四个控制块分别是IP、TCP、UDP以及RAW控制块,这里是通过union选定了之后,其他的结构体参数就会自动连接到union选定的结构体之中,非常方便!

netconn中定义了netconn_type连接类型;netconn_state表示当前的连接状态;然后union pcb定义了四种控制块选其一;err_t last_err表示最新错误;sys_sem_t op_completed表示API同步的信号量以及sys_mbox_t recvmbox表示接收数据的邮箱,等;

NETCONN收发的数据管理

收发的数据结构体
定义了netbuf的结构体;包含pbuf类型的p和ptiji发送方IP地址ip_addr_t addr;以及发送方端口号u16_t port;

其中,p和ptr都指向pbuf链表,不同的是,p一直只想pbuf链表的第一个pbuf结构,而ptr可能指向链表的其他位置netbuf_next()和netbuf_first()操作ptr字段

addr和port来记录数据发送方的IP地址和端口号,netbuf_fromaddr和netbuf_fromport这两个宏定义来返回addr和port字段

之前就有过解析,在通过NETCONN创建udp的控制块中,会有recv_udp函数来进行udp_recv的回到函数的编写,是lwIP内核实现的;recv_udp中,会构造netbuf结构体的指针buf,memp_malloc之后,buf的p和ptr指针都赋值p,addr和port也是给定相应的Ip地址和端口号然后通过sys_mbox_trypost把buf发送出去

接收数据,则是调用netconn_recv完成;而该函数最后,如果是调用了UDP协议,会return netconn_recv_data函数;这个函数中,会调用sys_arch_mbox_fetch接收消息,接受的就是buf这个pbuf数据;接受到了之后,会把他传入recvbuf之中;然后遍历pbuf链表并调用memcpy进行拷贝,获取udp数据到数据缓冲区g_lwip_demo_recvbuf之中。

针对netconn结构体中,需要注意宏定义LWIP_SO_SNDTIMEO,这个宏定义之0,则recv和send函数都是阻塞状态;也就是说接收和发送在同一任务重,由超时事件来控制,一般都不这么使用,会影响效率,所以这个宏置1

3. NETCONN实现原理

NETCONN示意图
netconn_alloc创建了netconn结构体和邮箱;调用了udp_new和udp_recv完成了udp控制块以及rcv的实现;netconn_bind把IP地址和端口号传入netconn,然后调用netconn_connect进行连接;数据会先进入udp控制块,进入pbuf后借由recv_udp给到发送邮箱recvnbox,发送出去后在通过接收邮箱recvmbox接收到

邮箱传输的是pbuf的地址,pbuf由netbuf管理!

NETCONN与RAW区别

NETCONN与RAW接口比对
NETCONN就类似于STM32的标准库开发,而RAW接口类似于STM32寄存器开发

3. NETCONN相关函数

相关函数

总结

NETCONN就是对RAW接口进行初步封装,能够省去自己实现五个回调函数的步骤,更好的进行抽象,帮助我们开发以太网的连接。

相关文章:

正点原子lwIP学习笔记——NETCONN接口简介

1. NETCONN接口简介 NETCONN API 使用了操作系统的 IPC 机制, 对网络连接进行了抽象,使用同一的接口完成UDP和TCP连接。 NETCONN API接口是在RAW接口基础上延申出来的一套API接口 首先会调用netconn_new创建一个pcb控制块,其实际是一个宏定…...

PHP自动识别采集何意网址文章正文内容

在做PHP采集内容时,用过querylist采集组件,但是这个插件采集页面内容时,都必须要写个采集选择器。这样比较麻烦,每个文章页面都必须指定一条采集规则 。就开始着手找一个插件可以能自动识别任意文章url正文内容并采集的&#xff0…...

区块链实验室(27) - 区块链+物联网应用案例

分享最新的区块链物联网应用案例:HPCLS-BC...

NPU上PyTorch模型训练问题案例

在昇腾AI处理器上训练PyTorch框架模型时,可能由于环境变量设置问题、训练脚本代码问题,导致打印出的堆栈报错与实际错误并不一致、脚本运行异常等问题,那么本期就分享几个关于PyTorch模型训练问题的典型案例,并给出原因分析及解决…...

出现 conda虚拟环境默认放在C盘 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法3.1 方法一3.2 方法二1. 问题所示 通过conda配置虚拟环境的时候,由于安装在D盘下,但是配置的环境默认都给我放C盘 通过如下命令:conda env list,最后查看该环境的确在C盘下 2. 原理分析 究其根本原因,这是因为默认路径没有足够的…...

Ubuntu Postgresql开机自启动服务

1. 建立service文件 sudo vim /etc/systemd/system/postgresql.service2. postgresql service文件 [Unit] DescriptionPostgreSQL 14 database server Documentationman:postgres(1) Documentationhttp://www.postgresql.org/docs/14/static/ Afternetwork.target[Service] T…...

COTS即Commercial Off-The-Shelf 翻译为“商用现成品或技术”或者“商用货架产品”

COTS 使用“不再做修理或改进”的模式出售的商务产品 COTS即Commercial Off-The-Shelf 翻译为“商用现成品或技术”或者“商用货架产品”,指可以采购到的具有开放式标准定义的接口的软件或硬件产品,可以节省成本和时间。 中文名 商用现成品或技术 外文…...

idea开发Springboot出租车管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 出租车管理系统是一套完善的完整信息系统,结合springboot框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开发), 系统具有完整的源代码和数据…...

Linux nohup

nohup 命令用于在 Linux 中将命令或程序在后台运行,并且在终端关闭后仍然保持运行。 nohup命令 描述 nohup 命令用于将命令或程序以不受终端挂断影响的方式在后台运行。 语法 nohup command [arguments] &参数 command:要在后台运行的命令或程…...

Linux 常见问题

1. 使用 sudo 命令时,提示 is not in the sudoers file. 是由于对应用户没有添加到 sudoers 文件中,可以在该文件中指定用户权限。运行以下命令即可打开该文件: visudo 添加上对应用户的权限 Ctrl x 退出保存即可。 2. Debian 新建的普通用…...

仕达利恩飞讯软件TPM设备管理项目正式启动,向数字化再迈一步

9月25日,仕达利恩(惠州)科技有限公司(以下简称“仕达利恩”)设备智能数采项目启动会成功召开,仕达利恩首席崔浩渊、杨翠琼次长携项目主要负责人共同出席本次启动会。为解决仕达利恩现阶段生产过程中的设备管理、设备配件仓管理以及…...

【算法】分治法

文章目录 概念原理和步骤代码示例 总结 概念 分治法(Divide and Conquer)是一种算法设计策略,其思想是将一个大问题划分为若干小规模的子问题,然后递归地解决每个子问题,并将它们的解合并起来以得到原始问题的解。分治…...

Rabbit消息的可靠性

生产者重连 消费者重试 Confirm模式简介 消息的confirm确认机制,是指生产者投递消息后,到达了消息服务器Broker里面的exchange交换机,则会给生产者一个应答,生产者接收到应答,用来确定这条消息是否正常的发送到Broker…...

Java中的网络编程是什么?

Java中的网络编程是指使用Java编程语言进行网络通信的过程和技术。它允许Java程序在互联网或局域网上进行数据交换、通信和传输。 Java提供了许多类和接口,用于实现网络编程。主要的网络编程相关的类在java.net包中可以找到。以下是一些常用的类和接口:…...

Oracle 常用命令大全

数据库 ----数据库启动 & 关闭 启动数据库 SQL> startup nomount; SQL> alter database mount; SQL> alter database open;关闭数据库 SQL> shutdown immediate;更多内容请参考:Oracle数据库启动和关闭 ----连接数据库 登陆普通用…...

Mysql 开启ssl连接

本文是针对Mysql 5.7版本以上数据库 1. 检查当前SSL / TLS状态 我们将使用-h指定IPv4本地环回接口,以强制客户端与TCP连接,而不是使用本地套接字文件。 这将允许我们检查TCP连接的SSL状态: mysql -u root -p -h 127.0.0.1键入以下内容以显示SSL / TLS变量的状态: SHOW …...

Java Stream流对List集合进行分页

有一种情况,我们有时不便在数据库层面进行分页。我们知道Mybatis的startPage();方法也是对数据库进行limit操作,有没有一种方式,只对List集合进行分页呢? 当然有,我们可以使用Stream流的方式对List集合进行操作&#…...

Docker(二)、linux环境Docker的部署以及构建镜像

linux环境Docker的部署以及构建镜像 一、docker部署1、快速部署常用的命令:1.1、demo-部署tomcat1.2、tomcat容器内部结构1.2.1、每个tomcat容器,都包含三个组件1.2.2、在容器内部执行命令 1.3、容器生命周期 二、Dockerfile构建镜像1、demo-Dockerfile自…...

GEE错误——Image.select: Pattern ‘MDF‘ did not match any bands

问题 ImageCollection (Error) Collection query aborted after accumulating over 5000 elements. ImageCollection (268 elements) Mean DOD550: Layer error: ImageCollection.reduce: Error in map(ID=MCD19A2_A2001001_h15v17_061_2022161165308_01): Image.select: Patte…...

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— JS基础(四)

开始吧&#xff0c;做时间的主人&#xff01; 把时间分给睡眠&#xff0c;分给书籍&#xff0c;分给运动&#xff0c; 分给花鸟树木和山川湖海&#xff0c; 分给你对这个世界的热爱&#xff0c; 而不是将自己浪费在无聊的人和事上。 思维导图 函数 为什么需要函数 <!DO…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...