正点原子lwIP学习笔记——Socket接口UDP实验
1. Socket接口UDP连接配置
Socket接口的UDP配置流程如下:
- sin_family 设置为 AF_INET 表示 IPv4 网络协议;
- sin_port 为设置端口号, 可设置为 8080;
- sin_addr.s_addr 设置本地 IP 地址;
- 调用函数 Socket 创建 Socket 连接 ,注意该函数的第二个参数 SOCK_STREAM 表示 TCP 连接 SOCK_DGRAM 表示 UDP 连接;
- 调用函数 bind 将本地服务器地址与 Socket 进行绑定;
- 调用收发函数接收或者发送。
2. Socket接口UDP实验
例程功能:
本实验使用
Socket 编程接口实现 UDP 服务器, 并可通过按键发送 UDP 广播数据至其他的 UDP 客户端,也能够接收其他 UDP 客户端广播的数据,并实时显示至 LCD 屏幕上 。
main.c和freertos.c都与之前的NETCONN实验是一样的;
lwip_demo中,可以直接IP_ADDR通过宏定义为自己的远程IP地址;这里还有一个区别,发送和接收是创建了两个线程,而之前的NETCONN在一个线程中,通过延时完成发送和接收;
通过sockaddr_in的结构体新建一个g_local_info来填写网络的相关参数,uint8_t一个数据缓冲区g_lwip_demo_recvbuf;通过lwip_data_send调用sys_thread_new新建一个发送线程,其中就传入了lwip_send_thread;然后memset对g_local_info清零,并通过其结构体参数初始化长度、IP协议和本地IP地址和端口号;然后调用socket建立一个新的Socket连接,返回给到g_sock_fd(socklen_t,就是uint32_t);
完成创建之后,通过bind把g_local_info的信息绑定到g_sock_fd;
然后会进入到while死循环,通过memset初始化数据缓冲区为0;然后调用recv来进行数据接收,这是一个阻塞线程,只有接收到数据才能往下执行;接收到数据之后,调用xQueueSend,发送到显示的功能中进行显示;
发送的线程,最后就是调用了自定义的lwip_send_thread;其会在g_local_info之中设置远程的IP地址;通过标志位判断是否需要发送(标志位的操作通过按键改变);发送就是调用sendto函数,发送完成后清除标志位。
3. Socket接口UDP广播实验
这里的区别就是新建了send和recv的结构体,里面存放了缓冲的buf和size大小;lwip_demo中需要建立一个link_socjet_info结构体的指针socket_info,然后mem_malloc分配socket_info的内存;之后调用socket建立连接,通过setsockopt设置optval选项值;然后配置socket_info的IP协议、端口号还有本地IP地址,需要注意这里是广播所以配置为“255.255.255.255”;之后的发送和接收就是一样的操作了。
4. Socket接口UDP组播实验
首先需要配置HAL库:
在ethernet.c中,找到HAL_ETH_Init函数,进入后下翻找到ETH_MACDMAConfig,往下找,有两个一定要如下配置:
macinit.ReceiveAll = ETH_RECEIVEALL_ENABLE;
macinit.MulticastFramesFilter = ETH_MULTICASTFRAMESFILTER_NONE;
这样才可以使用组播;
然后再lwipopts.h中找到IGMP的配置,该宏定义必须置1;
找到ethernetif.c,其中网卡的flags需要如下配置:
netif->flags = NETIF_FLAG_BROADCAST|NETIF_FLAG_ETHARP|NETIF_FLAG_LINK_UP|NETIF_FLAG_IGMP; / 广播 ARP协议 链接检测 /
添加了IGMP;
组播与之前的区别就是,在link_socjet_info中添加了ip_mreq这个组播结构体multicast_mreq;然后定义一个结构体ip_mreq_t里面存储多播的控制块ip_mreq结构体的mreq以及信息长度socklen_t结构体的mreq_len;
多播的IP地址为“224.0.1.0”,lwip_demo中还需要定义一个ip_mreq_t的结构体指针mreq_info;同样也要对socket_info添加IP协议和本地IP地址和端口号,然后设置就收和发送缓冲区并调用bind绑定socket_info以及本地的网络接口;
区别在于,还需要设置mreq_info,也就是组播的IP地址以及待加入的IP地址,然后调用setsockopt添加多组播成员;
其余的发送和接收线程就与之前类似,这里不赘述了。
总结
Socket来进行开发比NETCONN更加简单,更多的会使用Socket来进行开发,除非对实时性要求很高,那就会自行实现RAW接口。
相关文章:
正点原子lwIP学习笔记——Socket接口UDP实验
1. Socket接口UDP连接配置 Socket接口的UDP配置流程如下: sin_family 设置为 AF_INET 表示 IPv4 网络协议;sin_port 为设置端口号, 可设置为 8080;sin_addr.s_addr 设置本地 IP 地址;调用函数 Socket 创建 Socket 连…...

连接组学中的机器学习:从表征学习到模型拟合
前言 机器学习(ML)由于其高自动化程度、高灵敏度和特异性优势,在医学影像领域取得了巨大的成功。由于具备这些优势,机器学习已被广泛应用于神经成像数据,目的是提取与感兴趣变量(如疾病状态)相关的特征。这使我们能够形成关于不同条件下大脑…...

数据结构-----二叉树的创建和遍历
目录 前言 二叉树的链式存储结构 二叉树的遍历 1.前序遍历 2.中序遍历 3.后序遍历 二叉树的创建 创建一个新节点的函数接口 1.创建二叉树返回根节点 2.已有根节点,创建二叉树 3.已有数据,创建二叉树 前言 在此之前我们学习了二叉树的定义和储…...
【算法题】1333. 餐厅过滤器
题目: 给你一个餐馆信息数组 restaurants,其中 restaurants[i] [idi, ratingi, veganFriendlyi, pricei, distancei]。你必须使用以下三个过滤器来过滤这些餐馆信息。 其中素食者友好过滤器 veganFriendly 的值可以为 true 或者 false,如果…...
linux脚本笔记
目录 1.增加环境变量 2.自定义命令快捷键 3.关闭selinux和防火墙 4.增加别名快捷键 5.Linux链接 1.增加环境变量 新建add_env.sh #!/bin/bashapp_dir"/root/docker"# 检查配置文件中是否已存在相同的环境变量 if grep -q -E "^export APP_HOME.*" ~…...
目标检测YOLO实战应用案例100讲-面向路边停车场景的目标检测(中)
目录 3.1.1 特征图相似度计算 3.1.2 特征图相似度实验 3.1.3 基于GhostBlock的网络结构改进...

[论文笔记]Prefix Tuning
引言 今天带来微调LLM的第二篇论文笔记Prefix-Tuning。 作者提出了用于自然语言生成任务的prefix-tuning(前缀微调)的方法,固定语言模型的参数而优化一些连续的任务相关的向量,称为prefix。受到了语言模型提示词的启发,允许后续的token序列注意到这些prefix,当成虚拟toke…...

electron快速入门
新建electronstu01文件夹 以管理员身份运行powershell,切换到该文件下 npm init -y安装依赖包 npm install --save-dev electron失败 npm install -g cnpm --registryhttps://registry.npm.taobao.org cnpm install --save-dev electron修改 package.json &qu…...

C语言的stdio.h的介绍
C语言的stdio.h的介绍 C语言的stdio.h的介绍 C语言的stdio.h的介绍C语言stdio.h的介绍 C语言stdio.h的介绍 这个含义是导入标准输入输出库 包含头文件.h,std标准库,io是input output输入输出库 <>代表系统库,自定义的话用""…...

使用香橙派 在Linux环境中安装并学习Python
前言 在实际项目中,经常会遇到需要使用人工智能的场景,如人脸识别,车牌识别等...其一般的流程就是由单片机采集数据发送给提供人工智能算法模型的公司(百度云,阿里云...),然后人工智能将结果回…...

如何开发物联网 APP?
如何开发物联网 APP? 这个问题本身是不严谨的,APP只是手机端的一个控制或者用于显示的人机交互页面,物联网是通过传感器,物联网卡等模块把物体接入网络以方便远程监控或者控制等。 你问的应该是怎么开发出来一个远程控制物体的APP吧&#x…...

配置pytorchGPU虚拟环境-python3.7
cuda版本的pytorch包下载地址戳这里 winR->输入cmd->输nvcc -V回车 cuda 11.0 输入以下命令来查找 CUDA 的安装路径: Windows: where nvcc 输入以下命令来查找 cuDNN 的版本号: Windows: where cudnn* cuDNN 8.0 本机安装的是cuda 11.0&…...

Logic Pro X10.7.9(mac乐曲制作软件)
Logic Pro X是由苹果公司开发的一款专业音频制作软件,主要用于音乐制作、录音、混音和母带处理等方面。以下是Logic Pro X的特点: 强大的音频编辑功能:Logic Pro X提供了丰富的音频编辑工具,包括波形编辑器、音频自动化、时间拉伸…...

第一部分:HTML5
目录 一:网页 1.1:什么是网页? 1.2:什么是HTML? 1.3:网页的形成 二:常用浏览器 三:Web标准 3.1:为什么需要Web标准? 3.2:Web标准的构成 四&a…...

Linux 基础入门
目录 一、计算机 1、组成 2、功能 二、操作系统 1、定义 2、主要工作 3、操作系统内核功能 4、常见的操作系统 三、Linux的组成 四、搭建Linux学习环境 五、安装远程连接Linux的软件 1、安装xshell 2、安装mobaxterm 六、Linux操作系统学习大纲 一、计算机 1、组…...

【数据结构】插入排序:直接插入排序、折半插入排序、希尔排序的学习知识总结
目录 1、排序的基本概念 2、直接插入排序 2.1 算法思想 2.2 代码实现 3、折半插入排序 3.1 算法思想 3.2 代码实现 4、希尔排序 4.1 算法思想 4..2 代码实现 1、排序的基本概念 排序是将一组数据按照预定的顺序排列的过程,排序的基本概念包括以下内容…...

Magic Battery for Mac:让你的设备电量管理变得轻松简单
Mac电脑用户们,你们是否曾经为了给设备充电而感到烦恼?是否希望能够方便地查看连接设备的电量情况?现在,有了Magic Battery for macOS,这些问题都将成为过去! Magic Battery是一个实用的应用程序ÿ…...

nodejs+vue大学食堂订餐系统elementui
可以查看会员信息,录入新的会员信息,对会员的信息进行管理。 网站管理模块对整个网站中的信息进行管理,可以查看会员留在留言栏中的信息,设置网站中的参数等。用户管理模块主要实现用户添加、用户修改、用户删除等功能。 近年来&…...

nat综合实验
路漫漫其修远兮,吾将上下而求索。 实验目的如图 实验思路:配置内网,再配置外网,再做nat clien1配置 clien2配置 pc3配置 lsw1配置 sysname lsw1 # vlan batch 10 20 30 # interface MEth0/0/1 # interface Eth-Trunk1port link-type trunkp…...
【iOS逆向与安全】好用的一套 TCP 类
初始化 //页面 %hook xxxxxxxViewController//- (void)viewWillAppear:(BOOL)animated{ //NSLog("View Will Appear,再次进入刷新"); - (void)viewDidLoad{//启动tcp[[Xddtcp sharedTcpManager] connectServer] ;} 发送数据 //发送数据 [[Xddtcp shared…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...

【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...