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

RHEL8搭建FOU隧道

RHEL8搭建FOU隧道

    • 搭建FOU隧道
      • 升级内核
      • 装载模块
      • 启用 IPv4 数据包转发功能
      • 升级iproute
    • 配置 FOU 隧道
      • k2接收端配置
      • k1发送端配置
      • 双向配置
      • `k1` 作为接收端配置一次。
      • `k2` 作为发送端配置一次。
      • 配置接口状态
      • 配置路由的下一跳IP
      • 配置路由
      • 隧道测试
    • 参考链接:

搭建FOU隧道

FOU是UDP 层的隧道技术

我们准备两台主机来配置一个 FOU 隧道,分别为 k1k2 ,配置的 IP 地址分别为 192.168.127.151192.168.127.152

主机名IP地址操作系统版本
k1192.168.50.152Oracle Linux8
k2192.168.50.152Oracle Linux8

升级内核

# 如果是uek内核,需要安装kernel-uek-modules内核模块
dnf install -y kernel-uek-modules# 重启
reboot

从 3.18 版本的内核才支持 fou。


装载模块

重启后查看两台机器的环境是否正常,并装载所需要的 fou 模块

# 加载fou模块及依赖模块
modprobe -a fou# 加载ipip模块
modprobe ipip# 查看fou模块
modinfo fou# 查看查看fou模块是否加载
lsmod|grep fou

lsmod | egrep 'ipip|fou'

# 在系统启动时自动加载fou及依赖的内核模块
echo fou >/etc/modules-load.d/fou.conf
echo ip6_udp_tunnel >>/etc/modules-load.d/fou.conf
echo udp_tunnel >>/etc/modules-load.d/fou.conf
echo ip_tunnel >>/etc/modules-load.d/fou.conf

即便是升级了内核,加载了 fou 模块,还需要对 ip_tunnel 模块有依赖,下面的输出如果没有 ip_tunnel 说明环境无法满足需要。

# 查看fou模块的依赖
modinfo --field=depends fou


启用 IPv4 数据包转发功能

要想这两台主机成功路由(转发)数据包,还需要开启转发功能。在 k1k2 上启用 IPv4 数据包转发功能

echo "
# 开启内核开启数据包转发
## 1为开启;0为关闭
net.ipv4.ip_forward=1 " >> /etc/sysctl.conf && sysctl -p

升级iproute

系统自带的 ip 命令是由 iproute 软件包提供的,要想使用 fou 子命令需要保证软件包的版本是新的。

# 升级iproute
yum -y update iproute

配置 FOU 隧道

配置一条 FOU 隧道需要两步。发送端 k1 和接收端 k2 分别设置,这样能允许人们随意配置它们。


k2接收端配置

在接收端 k2 上只要设置一个端口用于接收封装好的数据报文就行了。有个新的 fou 子命令可用于此:

# 添加UDP端口5555作为FOU接收端口,指定封装协议为IPv4(协议号4)
ip fou add port 5555 ipproto 4

此命令在接收端 k2 设置了 5555 端口,指明此端口接收到的数据报的协议号是 4,也就是 IP 封包。此端口接收到的数据包会被拆解掉外面的封装;然后再放入到网络堆栈中,从而发往它的实际目的地址。想要删除这个端口则使用 ip fou del port 5555 ipproto 4


k1发送端配置

在发送端 k1 就稍复杂了点,因为必须指定目的地址,还要能够与已有的封装协议共存。典型的命令如下:

# ip link add ftok2 \          # 创建名为 ftok2 的虚拟网络接口
# type ipip \                 # 指定为 IPIP 隧道(IPv4 over IPv4)
# remote 192.168.50.152 \    # 设置远程终端 IP(接收端)
# local 192.168.50.151 \     # 设置本地终端 IP(发送端)
# ttl 255 \                   # 设置封装数据包的 TTL 为 255(防止环路)
# dev ens160 \                  # 绑定到物理网卡 ens160 传输
# encap fou \                 # 使用 FOU 封装(Foo Over UDP)实现 UDP 隧道
# encap-sport auto \          # 自动分配源 UDP 端口
# encap-dport 5555            # 固定目的 UDP 端口为 5555# 配置发送端
ip link add ftok2 type ipip remote 192.168.50.152 local 192.168.50.151 ttl 255 dev ens160 encap fou encap-sport auto encap-dport 5555

如果要删除ftok2接口,执行sudo ip link delete ftok2

此命令在发送端 k1 设置了一个新的虚拟接口(ftok2),用于 IPIP 封装。数据包的源端口由网络栈决定,而目的端口设置为 5555 。当然要使用这个网络接口还要选择封装协议,目前支持的协议有 IPIP,SIT(IPv4-IPv6隧道协议)和 GRE(用于虚拟专用网)。

配置完成后即可使用 ip tunnel 命令查看隧道信息,其中 tunl0fou 模块装载后系统自动生成的。

ip tunnel show


双向配置

通信是双向的,因此还需要按照上述的步骤反过来。


k1 作为接收端配置一次。

ip fou add port 5555 ipproto 4

k2 作为发送端配置一次。

请注意命令中的名称以及 remotelocal 对应的地址。

# ip link add ftok1 \          # 创建名为 ftok2 的虚拟网络接口
# type ipip \                 # 指定为 IPIP 隧道(IPv4 over IPv4)
# remote 192.168.50.151 \    # 设置远程终端 IP(接收端)
# local 192.168.50.152 \     # 设置本地终端 IP(发送端)
# ttl 255 \                   # 设置封装数据包的 TTL 为 255(防止环路)
# dev ens160 \                  # 绑定到物理网卡 ens160 传输
# encap fou \                 # 使用 FOU 封装(Foo Over UDP)实现 UDP 隧道
# encap-sport auto \          # 自动分配源 UDP 端口
# encap-dport 5555            # 固定目的 UDP 端口为 5555# 配置发送端
ip link add ftok1 type ipip remote 192.168.50.151 local 192.168.50.152 ttl 255 dev ens160 encap fou encap-sport auto encap-dport 5555# 查看接口状态
ip tunnel show


配置接口状态

隧道配置完成后虚拟的接口是处于 DOWN 状态的,可以通过 ip link show 命令查看

ip link show ftok2ip link show ftok1

可以看到 state DOWN,说明接口没有启用, 通过 ip link set 命令将接口启用

[root@k1 ~]# ip link set ftok2 up
[root@k1 ~]# ip link show ftok2  [root@k2 ~]# ip link set ftok1 up
[root@k2 ~]# ip link show ftok1  

现在,隧道就成功地建立起来了。


配置路由的下一跳IP

由于隧道属于虚拟接口,因此对于路由的下一跳(下一个越点)的 IP 地址只能配置在本机的虚拟接口上。此处我们称下一跳 IP 为 GWIP(网关IP)。

现在我们在 k1 上配置 GWIP10.10.10.1

[root@k1 ~]# ip addr add 10.10.10.1 dev ftok2
[root@k1 ~]# ip addr show dev ftok2

k2 上配置 GWIP10.10.10.2

[root@k2 ~]# ip addr add 10.10.10.2 dev ftok1
[root@k2 ~]# ip addr show dev ftok1


配置路由

要想实现在隧道中进行通信,就需要在两端配置静态路由。使用 ip route 命令可以实现在 Linux 主机添加静态路由。命令格式如下:

ip  route  add  to  目标网络  via  下一跳IP  dev 从本机出去的网卡名称

现在有了 GWIP 就可以通过隧道路由了,我们将这两个 GWIP 做通试试看。

k1 上配置到 k2 的路由

[root@k1 ~]# ip route add to 10.10.10.2 via 10.10.10.1 dev ftok2

k2 上配置到 k1 的路由

[root@k2 ~]# ip route add to 10.10.10.1 via 10.10.10.2 dev ftok1

隧道测试

k1 作为发送端

[root@k1 ~]# ping -I 10.10.10.1 10.10.10.2 -c 3

k2 作为发送端

[root@k2 ~]# ping -I 10.10.10.2 10.10.10.1 -c 3

通过抓包可以看到数据包的请求和响应过程中,接收端的端口都是 5555

[root@k2 ~]# tcpdump -nn -i ens160 udp port 5555	

做了 GWIP静态路由之后,两个机器的 GWIP 能互通说明隧道建立成功了,此时你就可以根据实际的情况和需求,添加公网静态路由到隧道了。


参考链接:

  • https://lwn.net/Articles/614348/
  • https://www.netdevconf.org/0.1/sessions/11.html

相关文章:

RHEL8搭建FOU隧道

RHEL8搭建FOU隧道 搭建FOU隧道升级内核装载模块启用 IPv4 数据包转发功能升级iproute 配置 FOU 隧道k2接收端配置k1发送端配置双向配置k1 作为接收端配置一次。k2 作为发送端配置一次。配置接口状态配置路由的下一跳IP配置路由隧道测试 参考链接: 搭建FOU隧道 FOU是…...

单片机自动排列上料控制程序 下

/***************上料时间参数显示******************/ void dis_timea(uchar s) { uchar x,y; uint i0; A1s/100; A2(s-A1*100)/10; A3s-A1*100-A2*10; …...

科技成果鉴定测试有哪些内容?又有什么作用?

科技成果鉴定测试是评价科技成果质量和水平的方法之一,通过测试,可以对科技成果的技术优劣进行评估,从而为科技创新提供参考和指导。 一、科技成果鉴定测试的内容   1.技术评审:通过技术专家对项目进行详细的技术分析&#xff…...

【万字长文】深入浅出 LlamaIndex 和 LangChain:从RAG到智能体,轻松驾驭LLM应用开发

Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

一文读懂Nginx应用之 HTTP负载均衡(七层负载均衡)

目录 一、HTTP负载均衡简介 (一)、概述 (二)、upstream模块核心参数 1、server指令参数 2、负载均衡策略指令参数 (1)、轮询(Rond Robin) (2)、最少连接(least_conn) (3)、一致性哈希(Consistent Hash) (4)、IP哈希(IP Hash) 3、长连接指令参数 二、环境规划 三、N…...

【LeetCode】删除排序数组中的重复项 II

题目 链接 思路 双指针 我好聪明啊,自己想出了这个双指针的办法,哈哈哈哈哈哈哈,太高兴了 代码 class Solution(object):def removeDuplicates(self, nums):""":type nums: List[int]:rtype: int"""nlen…...

vite 初始化react项目

一. 初始化 npm create vitelatestProject name 项目名,例如:todo-listSelect a framework 选:ReactSelect a variant 选:TypeScript npm install //安装依赖 npm run dev //启动项目这样一个简单的react项目就实现了。 二.…...

LeetCode 216.组合总和 III:回溯算法实现与剪枝优化

目录 问题描述解决思路 回溯法剪枝优化 代码实现复杂度分析示例测试总结与扩展 1. 问题描述 给定两个整数 k 和 n,要求找出所有满足以下条件的组合: 组合包含 k 个不同的数字。组合中数字的和等于 n。组合中的数字范围为 [1, 9],且每个数字…...

【Bootstrap V4系列】学习入门教程之 组件-下拉菜单(Dropdowns)高级用法

Bootstrap V4系列 学习入门教程之 组件-下拉菜单(Dropdowns)高级用法 下拉菜单(Dropdowns)高级用法一、Directions 方向1.1 Dropup1.2 Dropright1.3 Dropleft 二、Menu items 菜单项2.1 Active 活动2.2 Disabled 禁用 三、Menu co…...

xiaopiu原型设计工具笔记

文章目录 有没有行组件是否支持根据图片生成原型呢? 其他官网 做项目要用到原型设计,还是那句话,遇到的必须会用,走起。 支持本地也支持线上。 有没有行组件 是这样,同一行有多个字段,如何弄的准确点呢? 目前只会弄…...

【hadoop】案例:Sqoop迁移仓库数据

1 数据导出:Hive导入MySQL [hadoophadoop1 sqoop]$ bin/sqoop export \ > --connect jdbc:mysql://localhost/weather \ > --username root \ > --password 123456 \ > --table mean_temperature \ > --export-dir /user/hive/warehouse/mydb/mean…...

南邮计科电工电子实验第五次课与非门设计数字锁逻辑电路小测答案

第五次课测试 题量: 16 满分: 100 一. 单选题(共10题,62.2分) 1. (单选题)下列哪个电路是基本的组合逻辑电路? A. 触发器B. 计数器C. 半加器D. 积分器 我的答案:C:半加器;正确答案:C:半加器; 6.2分 知识点: 组合…...

基于PyQt5的报警器实现说明

基于PyQt5的报警器实现说明 一、概述 本程序是一个基于PyQt5框架实现的报警器控制程序,通过串口与外部设备进行通信,向设备发送特定的十六进制指令来实现报警器的不同功能。PyQt5是Python中用于创建图形用户界面(GUI)的强大工具…...

pyorch中tensor的理解与操作(一)

tensor 是PyTorch 中一个最基本的数据集合类型, 本文注意针对该结构类型,说明它的存储方式以及主要的操作方法。 tensor其实是一个多维数组(元素的数据类型需一致),类似于 NumPy 的 ndarrays,但可以在 GPU …...

用react实现一个简单的三页应用

下面是一个使用 React Router 的简单示例,演示了如何在 React 应用中实现页面之间的导航。 🛠️ 第一步:使用 Vite 创建项目 npm create vitelatest my-router-app -- --template react cd my-router-app npm install🚀 第二步&a…...

OCCT中的布尔运算

OCCT 中的布尔运算是其几何建模的核心功能之一,主要用于实体的合并、切割和相交操作。以下是详细介绍及经典示例程序: 一、OCCT布尔运算的核心类 OCCT 通过 BRepAlgoAPI 命名空间下的类实现布尔运算,主要包括: BRepAlgoAPI_Fus…...

SpringBoot的自动配置和起步依赖原理

关于Spring Boot的自动配置和起步依赖,我想结合最新的实现机制来展开说明。先说自动配置——这是Spring Boot最核心的"约定优于配置"思想的落地体现。举个例子,当我们创建一个新的Spring Boot项目时,只要在pom.xml里添加了spring-b…...

沃伦森电气高压动态无功补偿装置助力企业电能优化

在工业生产的复杂电能环境中,电能质量直接影响企业的生产效率和运营成本。XX光伏科技有限公司作为一家快速发展的制造企业,随着生产规模的不断扩大,其内部电网面临功率因数过低、电压波动频繁等问题,导致供电部门罚款增加、设备故…...

VUE——自定义指令

Vue自定义指令概述 Vue自定义指令可以封装一些 dom 操作,扩展额外功能。它们允许开发者直接对DOM元素进行低层次操作,自定义指令可以响应Vue的响应式系统,从而在数据变化时触发相应的DOM更新。 自定义指令语法 自定义指令的常用钩子函数&am…...

Redis协议与异步方式

1.redis pipeline 通过一次发送多次请求命令,为了减少网络传输时间。 注意:pipeline 不具备事务性。 2.redis 事务 事务:用户定义一系列数据库操作,这些操作视为一个完整的逻辑处理工作单元,要么全部执行,…...

systemd vs crontab:Linux 自动化运行系统的全面对比

在 Linux 系统运维和开发中,任务调度与服务管理 是不可或缺的一环。无论是定期备份、日志轮转,还是启动后台服务,自动化机制都能极大地提高系统的可靠性与效率。两种最常用的自动化工具是: crontab:传统的基于时间的任…...

Centos离线安装mysql、redis、nginx等工具缺乏层层依赖的解决方案

Centos离线安装mysql、redis、nginx等工具缺乏层层依赖的解决方案 引困境yum-utils破局 引 前段时间,有个项目有边缘部署的需求,一台没有的外网的Centos系统服务器,需要先安装jdk,node,mysql,reids&#xf…...

观测云:安全、可信赖的监控观测云服务

引言 近日,“TikTok 遭欧盟隐私监管机构调查并处以 5.3 亿欧元”一案,再次引发行业内对数据合规等话题的热议。据了解,仅 2023 年一年就产生了超过 20 亿美元的 GDPR 罚单。这凸显了在全球化背景下,企业在数据隐私保护方面所面临…...

el-table计算表头列宽,不换行显示

1、在utils.js中封装renderHeader方法 2、在el-table-column中引入: 3、页面展示:...

多智能体学习CAMEL-调用api

可选模型范围 在ModelScope中的模型库中选择推理 API-Inference ,里面的模型都可以选择,我们可以体验到最新的使用DeepSeek-R1数据蒸馏出的Llama-70B模型。 1.2.2 使用API调用模型 这里我们使用CAMEL中的ChatAgent模块来简单调用一下模型,…...

奥威BI:AI+BI深度融合,重塑智能AI数据分析新标杆

在数字化浪潮席卷全球的今天,企业正面临着前所未有的数据挑战与机遇。如何高效、精准地挖掘数据价值,已成为推动业务增长、提升竞争力的核心议题。奥威BI,作为智能AI数据分析领域的领军者,凭借其创新的AIBI融合模式,正…...

SM2Utils NoSuchMethodError: org.bouncycastle.math.ec.ECFieldElement$Fp.<init

1,报错图示 2,报错原因: NoSuchMethodError 表示运行时找不到某个方法,通常是编译时依赖的库版本与运行时使用的库版本不一致。 错误中的 ECFieldElement$Fp. 构造函数参数为 (BigInteger, BigInteger),说明代码期望使…...

Spring Boot 中 MongoDB @DBRef注解适用什么场景?

在 Spring Boot 中使用 MongoDB 时,DBRef 注解提供了一种在不同集合(collections)的文档之间建立引用关系(类似于关系型数据库中的外键)的方式。它允许你将一个文档的引用存储在另一个文档中,并在查询时自动…...

PDF生成模块开发经验分享

在日常的项目开发中,PDF文档的生成是一个常见的需求。无论是用于申报单、审批结果通知书还是其他业务相关的文档输出,一个高效且灵活的PDF生成功能都是不可或缺的。本文将基于我使用Java(Spring Boot)和iText库开发PDF生成模块的经…...

Music AI Sandbox:打开你的创作新世界

AI 和音乐人的碰撞 其实,Google 早在 2016 年就启动了一个叫 Magenta 的项目,目标是探索 AI 在音乐和艺术创作上的可能性。一路走来,他们和各种音乐人合作,终于在 2023 年整出了这个 Music AI Sandbox,并且通过 YouTub…...

RISC-V入门资料

以下是获取 RISC-V 相关资料的权威渠道和推荐资源,涵盖技术文档、开发工具、社区支持等: 1. 官方资料 RISC-V 国际基金会官网 https://riscv.org 核心文档:ISA 规范(包括基础指令集(RV32I/RV64I)、扩展指令…...

私服与外挂:刑事法律风险的深度剖析

首席数据官高鹏律师团队编著 在当今数字化时代,网络游戏产业蓬勃发展,然而与之相伴的私服与外挂现象却屡禁不止,且其背后隐藏着严重的刑事法律风险。作为一名律师,有必要在此对私服与外挂相关的刑事问题进行深入解读,以…...

sherpa-ncnn:Endpointing(断句规则)

更多内容:XiaoJ的知识星球 目录 1. Endpointing (端点)1.1 规则11.2 规则21.3 规则3 1. Endpointing (端点) 我们有三条端点检测规则。如果激活了其中任何一个,我们假设检测到终端节点。 . 1.1 规则1 规则 1 计算尾随静默的持续时间。如果大于用户指…...

谷云科技iPaaS技术实践:集成平台如何解决库存不准等问题

在当今竞争激烈的商业环境中,电商平台、仓库系统以及门店系统之间的数据不同步问题,如同一颗隐形的 “定时炸弹”,严重威胁着企业的生存与发展。尤其是在库存管理方面,订单系统显示商品已售出,但仓库却无货可发&#x…...

负载均衡算法解析(一)NGINX

文章目录 1. 核心数据结构:算法的基石1.1 负载均衡节点结构:定义服务器实体1.2 关键概念阐述:权重 (Weight) 2. NGINX加权轮询算法旨在解决的具体问题深度分析2.1 应对后端服务器间的负载不均衡问题2.2 后端服务健康状态的动态感知与自适应调…...

计算机网络笔记(十六)——3.3使用广播信道的数据链路层

3.3.1局域网的数据链路层 一、核心逻辑架构(拓扑结构演变) 二、MAC层核心机制 MAC地址结构 以太网帧格式 CSMA/CD工作机制流程 三、关键功能对比表 功能集线器(Hub)交换机(Switch)网桥(Bridge)工作层级物理层数据链路层数据链路层冲突域处理全广播&…...

STM32-模电

目录 一、MOS管 二、二极管 三、IGBT 四、运算放大器 五、推挽、开漏、上拉电阻 一、MOS管 1. MOS简介 这里以nmos管为例,注意箭头方向。G门极/栅极,D漏极,S源极。 当给G通高电平时,灯泡点亮,给G通低电平时&a…...

单片机 + 图像处理芯片 + TFT彩屏 指示灯控件

指示灯控件使用说明 简介 这是一个基于单片机 RA8889/RA6809图形处理芯片的指示灯的控件库,用于在TFT显示屏上显示各种状态的指示灯。该控件支持多种状态显示,包括正常、警告、错误和停止等状态,并支持自定义标签显示。 功能特点 支持多…...

73页最佳实践PPT《DeepSeek自学手册-从理论模型训练到实践模型应用》

这份文档是一份关于 DeepSeek 自学手册的详细指南,涵盖了 DeepSeek V3 和 R1 模型的架构、训练方法、性能表现以及使用技巧等内容。它介绍了 DeepSeek V3 作为强大的 MoE 语言模型在数学、代码等任务上的出色表现以及其训练过程中的创新架构如多头潜在注意力和多 To…...

Python自动化-python基础(上)

一.魔法方法 在 Python 中,魔法方法(Magic Methods)是一类特殊的方法,以双下划线 __ 开头和结尾 ,它们在特定的场景下会被 Python 解释器自动调用,用于实现一些内置的操作行为。 1. 初始化与构造相关 __…...

mysql数据库体验

目录 数据库简介 使用数据库 数据库的基本概念 数据 数据库和数据库表 数据库管理系统和数据库系统 数据库系统发展史 经典数据库 网状模型 层次模型 关系模型 当今主流数据库介绍 关系数据库 非关系型库的基本概念 关系数据库的基本结构 主键与外键 主键 外…...

Python开发系统

以下是一个基于Python和OpenCV的简单图像检测系统开发示例,包含目标检测、颜色检测和边缘检测功能: 一、环境搭建 1. 安装依赖 pip install opencv-python numpy matplotlib 2. 准备测试图片 下载示例图片或使用本地图片(如 test.jpg &…...

架空输电线巡检机器人轨迹优化设计

架空输电线巡检机器人轨迹优化 摘要 本论文针对架空输电线巡检机器人的轨迹优化问题展开研究,综合考虑输电线复杂环境、机器人运动特性及巡检任务需求,结合路径规划算法、智能优化算法与机器人动力学约束,构建了多目标轨迹优化模型。通过改进遗传算法与模拟退火算法,有效…...

针对共享内存和上述windows消息机制 在C++ 和qt之间的案例 进行详细举例说明

针对共享内存和上述windows消息机制 在C++ 和qt之间的案例 进行详细举例说明 以下是关于在 C++ 和 Qt 中使用共享内存(QSharedMemory)和 Windows 消息机制(SendMessage / PostMessage)进行跨线程或跨进程通信的详细示例。 🧩 使用 QSharedMemory 进行进程间通信(Qt 示例…...

cursor平替,试试 vscode+cline+openrouter 的方案,还能自定义 mcp-server 教程大纲

一、引言 cursor 工具使用成本高的现状 编程agent好用,解放劳动力,但费用贵 vscodeclineopenrouter Cline 是一款可集成在 IDE 中的 AI 编程助手,支持 OpenAI 和 Ollama 等多种模型,能在 IDE 里自主完成复杂编程任务,…...

Qt实现车载多媒体项目,包含天气、音乐、视频、地图、五子棋功能模块,免费下载源文件!

本文主要介绍项目,项目的结构,项目如何配置,项目如何打包。这篇文章如果对你有帮助请点赞和收藏,谢谢!源代码仅供学习使用,如果转载文章请标明出处!(免费下载源代码)&…...

C++ set替换vector进行优化

文章目录 demo代码解释&#xff1a; 底层原理1. 二叉搜索树基础2. 红黑树的特性3. std::set 基于红黑树的实现优势4. 插入操作5. 删除操作6. 查找操作 demo #include <iostream> #include <set>int main() {// 创建一个存储整数的std::setstd::set<int> myS…...

Android学习总结之算法篇八(二叉树和数组)

路径总和 import java.util.ArrayList; import java.util.List;// 定义二叉树节点类 class TreeNode {int val;TreeNode left;TreeNode right;// 构造函数&#xff0c;用于初始化节点值TreeNode(int x) {val x;} }public class PathSumProblems {// 路径总和 I&#xff1a;判…...

正点原子IMX6U开发板移植Qt时出现乱码

移植Qt时出现乱码 1、前言2、问题3、总结 1、前言 记录一下正点原子IMX6U开发板移植Qt时出现乱码的解决方法&#xff0c;方便自己日后回顾&#xff0c;也可以给有需要的人提供帮助。 2、问题 用正点原子IMX6U开发板移植Qt时移植Qt后&#xff0c;sd卡里已经存储了Qt的各种库&…...

算法解密:轮转数组问题全解析

算法解密:轮转数组问题全解析 一、引言 在算法的世界里,数组的操作问题常常考验着我们对数据结构和算法技巧的掌握程度。“轮转数组”问题就是其中一个经典且有趣的题目。它看似简单,却蕴含着多种巧妙的解法。通过深入研究这个问题,我们能更好地理解数组的特性,提升算法思…...