lwip单网卡多ip的实现
1、今天要实现lwip的多个ip配置,本来以为需要自己修改很多核心代码
2、查阅资料才发现,lwip已经把接口留出来了
/** Define this to 1 and define LWIP_ARP_FILTER_NETIF_FN(pbuf, netif, type)
* to a filter function that returns the correct netif when using multiple
* netifs on one hardware interface where the netif's low-level receive
* routine cannot decide for the correct netif (e.g. when mapping multiple
* IP addresses to one hardware interface).
*/
/** 将此定义为1,并将LWIP_ARP_FILTER_NETIF_FN(pbuf, netif, type)定义为一个过滤函数,该函数在使用单个硬件接口上的多个netif时返回正确的netif。当netif的低级接收例程无法确定正确的netif时(例如,当将多个IP地址映射到单个硬件接口时),需要使用此过滤函数。
*/
#ifndef LWIP_ARP_FILTER_NETIF
#define LWIP_ARP_FILTER_NETIF 0
#endif

3、所以我们只需要定义好宏
#define LWIP_ARP_FILTER_NETIF 1 //多ip的支持
和写好
struct netif * LWIP_ARP_FILTER_NETIF_FN(struct pbuf *p, struct netif *netifIn, u16_t type)
函数即可
4、我的操作
4.1> 在lwipopt.h定义使能宏LWIP_ARP_FILTER_NETIF ,以支持多ip的操作

4.2、编写LWIP_ARP_FILTER_NETIF_FN函数,以能根据ip能找到对应的网卡
/*
*********************************************************************************************************
* Function Name : LWIP_ARP_FILTER_NETIF_FN
* Description : 多ip,识别正确的网卡
* Input : None
* Output : None
* Return : None
*********************************************************************************************************
*/
#include "lwip/prot/etharp.h"
struct netif * LWIP_ARP_FILTER_NETIF_FN(struct pbuf *p, struct netif *netifIn, u16_t type)
{struct netif *netif = NULL;struct etharp_hdr *hdr = NULL;struct ip_hdr *iphdr = NULL;ip_addr_t dest/*, src*/;switch (type){/*ARP*/case 0x0806:hdr = (struct etharp_hdr *)((unsigned char*)p->payload + 14);memcpy(&dest, &(hdr->dipaddr), sizeof(ip4_addr_t));//memcpy(&src, &hdr->sipaddr, sizeof (ip4_addr_t));for (netif = netif_list; netif != NULL; netif = netif->next){if (netif_is_up(netif)){if (ip4_addr_cmp(&dest,&(netif->ip_addr))){break;}}}break;/*IP*/case 0x0800:iphdr = (struct ip_hdr *) ((unsigned char*)p->payload + 14);ip_addr_copy_from_ip4(dest, iphdr->dest);//ip_addr_copy_from_ip4(src, iphdr->src);for (netif = netif_list; netif != NULL; netif = netif->next){if (netif_is_up(netif)){if (ip4_addr_cmp(&dest, &(netif->ip_addr))){break;}}}break;default:netif = netif_list;break;}netifIn = netif;if(netif==NULL){pbuf_free(p);}return netif;}
根据ip去匹配netif,arp需要单独处理,因为ip通信首先都要发送arp去找物理地址,不加这个arp处理,会出现你ping不通ip。所以如果知道物理地址,不加这个arp处理也可以,直接自己填mac即可,加到你自己的静态arp表中。
大家注意:

这个一定要加上,我刚开始没加,结果刚开始通,运行一段时间导致不通了,就是因为这里没释放申请的内存,导致无法处理新的数据
4.3、增加多ip的设置
//开始虚拟多ip--1IP4_ADDR(&ipaddr_v[1], 192,168,20,48);IP4_ADDR(&netmask_v[1], 255,255,255,0);IP4_ADDR(&gw_v[1], 192, 168, 20,1);netif_add(&g_netif_v[1], &ipaddr_v[1], &netmask_v[1], &gw_v[1], NULL, ðernetif_init, &tcpip_input); //网卡初始化和网卡输入netif_set_up(&g_netif_v[1]);//开始虚拟多ip--2IP4_ADDR(&ipaddr_v[2], 192,168,30,48);IP4_ADDR(&netmask_v[2], 255,255,255,0);IP4_ADDR(&gw_v[2], 192, 168, 30,1);netif_add(&g_netif_v[2], &ipaddr_v[2], &netmask_v[2], &gw_v[2], NULL, ðernetif_init, &tcpip_input); //网卡初始化和网卡输入netif_set_up(&g_netif_v[2]);
4.4、然后运行测试,OK
5、测试结果
刚开始测试结果是这样,我没在意,以为是硬件还是那里问题,ping移植有超时,或者卡顿较大

有时,还会出现几十上百ms的延迟,特别是多个电脑同时ping时。
6、ping超时,卡顿较大原因
1> 原来多个neif_add时:

会每次都初始化网卡,这里网卡在初始化时,会创建解析网络中断数据包的任务,所以存在多个任务去读网卡数据,造成数据的竞争,从而导致可能出现超时,卡顿较大
2> 我们只有一个网卡,所以只需初始化1次解析网络中断数据包的任务
改了之后就OK了
像下面这篇文章这样:


相关文章:
lwip单网卡多ip的实现
1、今天要实现lwip的多个ip配置,本来以为需要自己修改很多核心代码 2、查阅资料才发现,lwip已经把接口留出来了 /** Define this to 1 and define LWIP_ARP_FILTER_NETIF_FN(pbuf, netif, type) * to a filter function that returns the correct neti…...
// Error: line 1: XGen: Candidate guides have not been associated!
Maya xgen 报错// Error: line 1: XGen: Candidate guides have not been associated! 复制下面粘贴到Maya脚本管理器python运行: import maya.cmds as cmds def connect_xgen_guides():guide_nodes cmds.ls(typexgmMakeGuide)for node in guide_nodes:downstream…...
第21篇 基于ARM A9处理器用汇编语言实现中断<三>
Q:怎样编写ARM A9处理器汇编语言代码配置按键端口产生中断? A:使用Intel Monitor Program创建中断程序时,Linker Section Presets下拉菜单中需选择Exceptions。主程序在.vectors代码段为ARM处理器设置异常向量表,在…...
mac homebrew配置使用
本文介绍mac上homebrew工具的安装、配置过程。homebrew功能类似于centos的yum,用于软件包的管理,使用上有命令的差异。 本次配置过程使用mac,看官方文档,在linux上也可以用,但我没试过,有兴趣的同学可以试试…...
慧集通(DataLinkX)iPaaS集成平台-业务建模之业务对象(三)
4.搜索配置 搜索配置是用于该业务对象发布后被其它业务对象的搜索组件调用时界面显示内容以及对应查询条件的配置;当我们选择一条业务对象然后点击功能按钮【搜索配置】,则进入业务对象的搜索配置维护界面。 在搜索配置的维护界面我们可以维护该业务对象…...
【redis初阶】环境搭建
目录 一、Ubuntu 安装 redis 二、Centos7 安装 redis 三、Centos8 安装 redis 四、redis客户端介绍 redis学习🥳 一、Ubuntu 安装 redis 使用 apt 安装 apt install redis -y 查看redis版本 redis-server --version 支持远程连接…...
salesforce sandbox的用户如何重置密码
在 Salesforce Sandbox 环境中,用户可以通过以下步骤重置密码: 方法 1:通过用户界面重置密码 登录到 Sandbox 环境: 打开 Sandbox 环境的 URL,通常形如 https://test.salesforce.com。输入用户名和密码。如果忘记密码&…...
做一个 简单的Django 《股票自选助手》显示 用akshare 库(A股数据获取)
图: 股票自选助手 这是一个基于 Django 开发的 A 股自选股票信息查看系统。系统使用 akshare 库获取实时股票数据,支持添加、删除和更新股票信息。 功能特点 支持添加自选股票实时显示股票价格和涨跌幅一键更新所有股票数据支持删除不需要的股票使用中…...
01、kafka知识点综合
kafka是一个优秀大吞吐消息队列,下面我就从实用的角度来讲讲kafka中,“kafka为何有大吞吐的机制”,“数据不丢失问题”,“精准一次消费问题” 01、kafka的架构组织和运行原理 kafka集群各个节点的名称叫broker,因为kaf…...
怎么用python写个唤醒睡眠电脑的脚本?
环境: win10 python3.12 问题描述: 怎么用python写个唤醒睡眠电脑的脚本? 解决方案: 1.唤醒处于睡眠状态的电脑通常不是通过编程直接实现的,而是依赖于硬件和操作系统提供的特性。对于Windows系统,可…...
【Linux】Linux开发:GDB调试器与Git版本控制工具指南
Linux相关知识点可以通过点击以下链接进行学习一起加油!初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G编译器make与Makefile自动化构建 在 Linux 开发中,GDB 调试器和 Git 版本控制工具是开发者必备的利器。GDB 帮助快速定位代码问题,G…...
Git 的引用规格(refspec)语法
目录 引用规格语法格式常见用法强制 -f 和 的区别git fetch origin remote-branch:local-branch 和 git push origin local-branch:remote-branch 区别 引用规格语法格式 格式如下:[]<src>:<dst> 常见用法 # fetch git fetch origin <remote-bra…...
反转链表题目
文章目录 反转链表题目链接:[在线OJ](https://leetcode.cn/problems/reverse-linked-list/description/)题目详解思路1:思路1算法复杂度 思路2代码实现思路2算法复杂度 结语 欢迎大家来到我的博客,给生活来点impetus 让我们进入《题海探骊》…...
LED灯按键调光芯片、PWM调光IC、发光灯控制调光芯片
按键调光芯片,特别是LED灯使用PWM调光的芯片IC,是一种用于控制LED灯具亮度的集成电路,常用于台灯、壁灯、吊灯等照明设备中。这种芯片通过脉冲宽度调制(PWM)技术来调节LED的亮度,可以实现从最亮到最暗的平滑…...
Android Room 报错:too many SQL variables (code 1 SQLITE_ERROR) 原因及解决方法
报错信息: android.database.sqlite.SQLiteException: too many SQL variables (code 1 SQLITE_ERROR): while compiling: SELECT * FROM points WHERE id IN (?,?,?,...,?,?,?)SQLiteException: too many SQL variables 通常是由于一次查询或插入的 SQL 语句…...
USA-Entrepreneur-20240708-Business/Unusual
How to Get More Attention You can’t run a great business if you can’t capture people’s attention, says Gary Vaynerchuk. “如果你无法吸引人们的注意力,你就不能经营一家伟大的企业。”——Gary VaynerchukGary Vaynerchuk是一位知名的企业家、作家和公…...
AI算法在目标锁定跟踪领域的利与弊!
AI目标锁定与制导的优点 提高精度和效率: AI算法能够快速准确地分析大量数据,从而改进目标识别和跟踪,提高打击或投放的准确性和效率。 通过深度学习模型,AI可以识别图像中的特征并判断是否存在目标,进一步提取目标…...
移远BC28_opencpu方案_pin脚分配
先上图,BC28模块的pin脚如图所示: 下面看看GPIO的复用管脚 然后我自己整理了一份完整的pin功能列表...
初学stm32 --- II2C_AT24C02,向EEPROM中读写数据
目录 IIC总线协议介绍 IIC总线结构图 IIC协议时序 1. ACK(Acknowledge) 2. NACK(Not Acknowledge) IO口模拟II2C协议 发送起始信号: 发送停止信号: 检测应答信号: 发送应答信号&#x…...
动态规划汇总1
1.动态规划 动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...
归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...
