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

探索PcapPlusPlus开源库:网络数据包处理与性能优化

文章目录

    • 0. 本文概要
    • 1. PcapPlusPlus介绍
      • 1.1 概述
      • 1.2主要特性和功能
      • 1.3 PcapPlusPlus 主要模块关系和依赖
      • 1.4 网络协议层处理过程
    • 2. 实例
      • 2.1 基于 PcapPlusPlus 的应用程序设计和封装流程:
      • 2.2 多线程示例代码
      • 2.3 代码说明:
    • 3. 程序性能进一步优化
      • 3.1 避免重复解析
      • 3.2 减少内存分配
      • 3.3 直接操作数据
      • 3.4 利用硬件加速的方法
    • 4. PcapPlusPlus 的优势与缺点

0. 本文概要

本文将详细探讨 PcapPlusPlus,介绍其功能特性、实际应用示例以及模块间的关系和依赖,以帮助 C++ 工程师更好地理解和利用该库进行网络应用程序开发。

1. PcapPlusPlus介绍

1.1 概述

PcapPlusPlus 是一个跨平台的 C++ 网络数据包处理库,提供高级抽象和易用的 API,使开发者能轻松进行网络数据包的捕获、解析和生成。

1.2主要特性和功能

  1. 数据包捕获和解析

    • 支持多种网络捕获引擎,包括 libpcap、WinPcap、Intel DPDK 等。
    • 提供简洁的 C++ 接口,实现快速捕获和实时数据包解析。
  2. 高级协议解析和构造

    • 支持 Ethernet、IPv4、IPv6、TCP、UDP 等协议。
  3. 文件读写和离线分析

    • 支持 PCAP 和 PCAPNG 格式的数据包文件读写,便于离线数据分析和处理。
  4. 跨平台支持

    • 完全支持 Linux、MacOS和Windows 等多个平台。
  5. 高级网络安全功能

    • 提供 TCP 重组、IP 碎片重组等高级功能,支持复杂的网络安全分析和流量监控需求。

1.3 PcapPlusPlus 主要模块关系和依赖

依赖
依赖
Packet++
Pcap++
Common++
libpcap/WinPcap
Npcap
Intel DPDK
PF_RING
eBPF AF_XDP
其他第三方库和工具

此图展示了 PcapPlusPlus 中各核心模块的依赖关系,以及它们与底层网络捕获引擎(如 libpcap、WinPcap、Npcap 等)及其他第三方库(如 Intel DPDK、PF_RING、eBPF AF_XDP 等)的关联。

1.4 网络协议层处理过程

Packet Parsing
Layer Identification
Layer Processing
Packet Crafting
Packet Capture
Data Link Layer
Network Layer
Transport Layer
Application Layer
User Space
Protocol Parsing
Identify Layer Type
Process Layer Information
Further Processing
Create or Edit Packets
Packet Transmission
Network Device
Physical Transmission Medium

此图详细描述了网络数据包在 PcapPlusPlus 中的捕获到处理的整个过程,包括各协议层的解析和处理步骤。

2. 实例

2.1 基于 PcapPlusPlus 的应用程序设计和封装流程:

  • 初始化网络捕获设备:使用 PcapLiveDevice 类初始化网络设备,准备开始捕获数据包。
  • 设置捕获过滤器:通过 PcapLiveDevice::setFilter 函数设置过滤器,以过滤出特定的数据包。
  • 开始捕获数据包:调用 PcapLiveDevice::startCapture 函数启动捕获过程,持续监听网络接口上的数据包到达。
  • 捕获数据包:当有新的数据包到达时,通过注册的 onPacketArrives 函数进行捕获并存储在缓冲区中。
  • 解析数据包:使用 Packet::Packet 类解析捕获到的数据包,提取数据包的各个协议层信息。
  • 分发数据包:使用 PacketDispatcher 类将解析后的数据包传递给处理模块。
  • 处理数据包:通过 PacketHandler 类对数据包进行进一步处理,如协议分析、安全检查等。
  • 应用逻辑处理:通过 ApplicationLogic 类执行特定的应用逻辑,如网络监控、流量分析或安全审计等。
  • 生成响应或记录:使用 ResponseGeneratorLogger 类根据处理结果生成响应或将数据记录到日志或数据库中。
  • 继续捕获或结束:通过 DecisionMaker 类根据应用需求决定是否继续捕获数据包或结束捕获过程。
  • 关闭捕获设备:通过 PcapLiveDevice::stopCapture 函数结束捕获过程,关闭网络捕获设备。

2.2 多线程示例代码

#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
#include "Packet.h"
#include "PcapLiveDeviceList.h"
#include "PcapLiveDevice.h"
#include "IPv4Layer.h"using namespace std;
using namespace pcpp;// 全局变量
mutex mtx;
atomic<bool> stopCapture(false);
IPv4Layer* cachedIpLayer = nullptr;// 回调函数处理捕获到的数据包
void onPacketArrives(RawPacket* packet, PcapLiveDevice* dev, void* cookie) {// 异步处理数据包thread packetHandlerThread([packet]() {// 解析数据包Packet parsedPacket(packet);// 缓存解析结果cachedIpLayer = parsedPacket.getLayerOfType<IPv4Layer>();// 在这里可以进行更多的数据包处理,例如协议解析和业务逻辑处理if (cachedIpLayer) {// 在锁的作用域内进行输出,保证线程安全lock_guard<mutex> lock(mtx);cout << "捕获到数据包,源IP地址: " << cachedIpLayer->getSrcIpAddress().toString() << ", 目的IP地址: " << cachedIpLayer->getDstIpAddress().toString() << endl;}});packetHandlerThread.detach(); // 分离线程,允许异步运行
}int main() {// 获取设备列表vector<PcapLiveDevice*> devList = PcapLiveDeviceList::getInstance().getPcapLiveDevicesList();// 选择设备进行初始化PcapLiveDevice* dev = devList[0];if (!dev->open()) {cerr << "无法打开设备: " << dev->getLastError() << endl;return 1;}// 设置过滤器string filter = "ip"; // 过滤所有IP流量if (!dev->setFilter(filter)) {cerr << "无法设置过滤器: " << dev->getLastError() << endl;dev->close();return 1;}// 开始捕获数据包dev->startCapture(onPacketArrives, nullptr);// 捕获数据包一段时间后停止this_thread::sleep_for(chrono::seconds(10)); // 捕获10秒钟// 停止捕获并关闭设备dev->stopCapture();dev->close();return 0;
}

2.3 代码说明:

  • 缓存解析结果:在 onPacketArrives 回调函数中,使用 cachedIpLayer 全局变量缓存解析后的 IPv4Layer 对象。这样可以避免对每个数据包重复解析,节省CPU时间和内存开销。
  • 采用多线程异步处理:使用C++的异步处理机制,在捕获到数据包后启动一个新的线程或任务来处理数据包。这样可以利用多核处理器的能力并行处理数据包,提高处理速度。
开始
初始化网络捕获设备
(PcapLiveDevice)
设置捕获过滤器
(PcapLiveDevice::setFilter)
开始捕获数据包
(PcapLiveDevice::startCapture)
捕获数据包
(onPacketArrives)
是否有新数据包
创建新线程处理数据包
解析数据包
(Packet::Packet)
缓存解析结果
输出处理结果
(线程安全)
继续捕获或结束
(决策)
停止捕获并关闭设备
(PcapLiveDevice::stopCapture)
结束

3. 程序性能进一步优化

合理使用缓存、内存池和零拷贝技术,可以有效地避免重复解析、减少内存分配并直接操作数据,从而提升程序的性能和效率

3.1 避免重复解析

重复解析数据包会消耗大量的CPU时间和内存资源。为了避免这种情况,可以使用以下方法:

  • 缓存解析结果:在解析数据包后,将解析得到的关键信息(如协议头部字段)缓存起来,而不是每次都重新解析。这样可以避免多次访问数据包和重复执行解析操作。

  • 延迟解析:仅在需要时才进行解析。例如,可以根据应用需求,只在收到特定类型的数据包或者需要处理特定协议信息时才执行解析操作。

3.2 减少内存分配

动态内存分配和释放操作是性能瓶颈之一,特别是在高频率的数据包处理中。以下是减少内存分配的方法:

  • 使用内存池:预先分配一定数量的内存块,并在需要时从内存池中获取和释放内存,而不是每次都进行动态分配和释放。这样可以避免频繁的内存管理开销。

  • 重复使用数据结构:对于固定大小的数据结构或缓冲区,可以重复使用,避免频繁地创建和销毁对象。

3.3 直接操作数据

直接在原始数据上操作可以显著降低内存和CPU消耗,特别是对于大型数据包的处理。以下是实现直接操作数据的方法:

  • 使用零拷贝技术:在网络数据包处理中,尽量避免将数据从内核空间复制到用户空间的应用程序缓冲区。可以直接在网络接收缓冲区中操作数据,减少数据复制的开销和内存带宽消耗。

  • 原地修改数据:尽可能在接收到数据时直接在原始数据上进行操作和修改,避免创建中间副本或额外的数据结构。

3.4 利用硬件加速的方法

  • 选择适合的捕获引擎

    • Intel DPDK(Data Plane Development Kit):DPDK 提供了一个用户空间的数据包处理框架,可以利用支持 DPDK 的网卡直接从网络接口接收数据包,避免了数据包在内核空间和用户空间之间的复制,减少了 CPU 的负担和延迟。通过 DPDK,可以实现高性能的数据包捕获和处理。
  • 启用 Offload 功能

    • TCP Offload Engine(TOE):TOE 是一种专用硬件或芯片,可以在网卡上执行 TCP 协议处理,包括连接管理、流量控制和数据包的发送和接收,从而减轻主机 CPU 的负担。

4. PcapPlusPlus 的优势与缺点

优势

  • 高级抽象接口:PcapPlusPlus 封装了底层的网络捕获接口,提供了更高层次的抽象。

  • 统一的API:不论是在 Windows 还是 Linux 等平台上,PcapPlusPlus 提供了统一的API,使得开发者可以编写跨平台的网络应用程序,而无需关心底层接口的细节。

  • 丰富的功能扩展:PcapPlusPlus 提供了多种扩展功能,包括对 PCAP 和 PCAPNG 文件的完整支持、远程数据包捕获等。

  • 协议解析能力:PcapPlusPlus 提供了强大的协议解析功能,支持解析多种网络协议(如 TCP/IP、UDP、ICMP 等),并且具有良好的扩展性。

缺点

  • 学习曲线较陡:对于初学者来说,学习和掌握 PcapPlusPlus 的高级功能和API可能需要一定的时间和精力投入。
  • 功能复杂性:对于简单的数据包捕获和处理需求,使用 PcapPlusPlus 可能显得有些“杀鸡用牛刀”,过于复杂。

相关文章:

探索PcapPlusPlus开源库:网络数据包处理与性能优化

文章目录 0. 本文概要1. PcapPlusPlus介绍1.1 概述1.2主要特性和功能1.3 PcapPlusPlus 主要模块关系和依赖1.4 网络协议层处理过程 2. 实例2.1 基于 PcapPlusPlus 的应用程序设计和封装流程&#xff1a;2.2 多线程示例代码2.3 代码说明&#xff1a; 3. 程序性能进一步优化3.1 避…...

深入理解SSH:网络安全的守护者

在当今数字化时代&#xff0c;网络安全已成为全球关注的焦点。随着网络攻击手段的不断升级&#xff0c;保护数据传输的安全性变得尤为重要。SSH&#xff08;Secure Shell&#xff09;作为一种安全的网络协议&#xff0c;为远程登录和网络服务提供了强大的安全保障&#xff0c;成…...

DDD学习笔记四

领域模型的构建 基础领域模型的基本组成有名称、属性、关联、职责、事件和异常 发掘领域概念3种策略&#xff1a; 1&#xff09;学习已有系统&#xff0c;重用已有模型 2&#xff09;使用分类标签。分类标签来源于领域&#xff0c;需要我们研究一些资料并做一些提炼。从采用5W…...

Head First设计模式中的典型设计模式解析与案例分析

Head First设计模式中的典型设计模式解析与案例分析 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 《Head First设计模式》是一本广受欢迎的书籍&#xff0c…...

iptables 防火墙(一)

iptables 防火墙&#xff08;一&#xff09; 一、Linux 防火墙基础防火墙分类 二、iptables 的表、链结构规则表规则链数据包过滤的匹配流程 三、编写防火墙规则iptables 的安装iptables的基本语法规则的匹配条件通用匹配隐含匹配显式匹配 四、总结 在网络安全的世界里&#xf…...

数据库物理结构设计-定义数据库模式结构(概念模式、用户外模式、内模式)、定义数据库、物理结构设计策略

一、引言 如何基于具体的DBMS产品&#xff0c;为数据库逻辑结构设计的结果&#xff0c;即关系数据库模式&#xff0c;制定适合应用要求的物理结构 1、在设计数据库物理结构前&#xff0c;数据库设计人员首先 要充分了解所用的DBMS产品的功能、性能和特点&#xff0c;包括提供…...

QT加载安装外围依赖库的翻译文件后翻译失败的现象分析:依赖库以饿汉式的形式暴露单例接口导致该现象的产生

1、前提说明 VS2019 QtClassLibaryDll是动态库,QtWidgetsApplication4是应用程序。 首先明确:动态库以饿汉式的形式进行单例接口暴露; 然后,应用程序加载动态库的翻译文件并进行全局安装; // ...QTranslator* trans = new QTranslator();//qDebug() << trans->…...

13_旷视轻量化网络--ShuffleNet V2

回顾一下ShuffleNetV1:08_旷视轻量化网络--ShuffleNet V1-CSDN博客 1.1 简介 ShuffleNet V2是在2018年由旷视科技的研究团队提出的一种深度学习模型&#xff0c;主要用于图像分类和目标检测等计算机视觉任务。它是ShuffleNet V1的后续版本&#xff0c;重点在于提供更高效的模…...

Linux系统编程--进程间通信

目录 1. 介绍 1.1 进程间通信的目的 1.2 进程间通信的分类 2. 管道 2.1 什么是管道 2.2 匿名管道 2.2.1 接口 2.2.2 步骤--以父子进程通信为例 2.2.3 站在文件描述符角度-深度理解 2.2.4 管道代码 2.2.5 读写特征 2.2.6 管道特征 2.3 命名管道 2.3.1 接口 2.3.2…...

docker-本地部署-后端

前置条件 后端文件 这边是一个简单项目的后端文件目录 docker服务 镜像文件打包 #命令行 docker build -t author/chatgpt-ai-app:1.0 -f ./Dockerfile .红框是docker所在文件夹 author&#xff1a;docker用户名chatgpt-ai-app&#xff1a;打包的镜像文件名字:1.0 &#…...

TLS + OpenSSL + Engine + PKCS#11 + softhsm2 安全通信

引擎库路径只有在 /lib 下才能被 "LOAD" 识别到&#xff0c;OpenSSL的ReadMe给的示例在/lib&#xff0c;大概是在构建OpenSSL时默认的configure指定了lib路径 // #define PKCS11_ENGINE_PATH "/usr/lib/x86_64-linux-gnu/engines-1.1/pkcs11.so" #define …...

Unity实现简单的MVC架构

文章目录 前言MVC基本概念示例流程图效果预览后话 前言 在Unity中&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;框架是一种架构模式&#xff0c;用于分离游戏的逻辑、数据和用户界面。MVC模式可以帮助开发者更好地管理代码结构&#xff0c;提高代码的可维护性…...

【简单讲解下OneFlow深度学习框架】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…...

FastGPT 调用Qwen 测试Hello world

Ubuntu 安装Qwen/FastGPT_fastgpt message: core.chat.chat api is error or u-CSDN博客 参考上面文档 安装FastGPT后 登录&#xff0c; 点击右上角的 新建 点击 这里&#xff0c;配置AI使用本地 ollama跑的qwen模型 问题&#xff1a;树上有3只鸟&#xff0c;开了一枪&#…...

Golang-GMP

GMP调度 golang-GMP语雀笔记整理 GMP调度设计目的&#xff0c;为何设计GMP?GMP的底层实现几个核心数据结构GMP调度流程 设计目的&#xff0c;为何设计GMP? 无论是多进程、多线程目的都是为了并发提高cpu的利用率&#xff0c;但多进程、多线程都存在局限性。比如多进程通过时…...

【PythonWeb开发】Flask自定义模板路径和静态资源路径

在大型的 Flask 项目中&#xff0c;确实可能会有多个子应用&#xff08;Blueprints&#xff09;&#xff0c;每个子应用可能都有自己的静态文件和模板。为了更好地管理和组织这些资源&#xff0c;可以使用static_folder 和template_folder 属性来统一管理。必须同时设置好主应用…...

Java对象创建过程

在日常开发中&#xff0c;我们常常需要创建对象&#xff0c;那么通过new关键字创建对象的执行中涉及到哪些流程呢&#xff1f;本文主要围绕这个问题来展开。 类的加载 创建对象时我们常常使用new关键字。如下 ObjectA o new ObjectA();对虚拟机来讲首先需要判断ObjectA类的…...

Does a vector database maintain pre-vector chunked data for RAG systems?

题意&#xff1a;一个向量数据库是否为RAG系统维护预向量化分块数据&#xff1f; 问题背景&#xff1a; I believe that when using an LLM with a Retrieval-Augmented Generation (RAG) approach, the results retrieved from a vector search must ultimately be presented…...

Rust-11-错误处理

Rust 将错误分为两大类&#xff1a;可恢复的&#xff08;recoverable&#xff09;和 不可恢复的&#xff08;unrecoverable&#xff09;错误。对于一个可恢复的错误&#xff0c;比如文件未找到的错误&#xff0c;我们很可能只想向用户报告问题并重试操作。不可恢复的错误总是 b…...

自动化测试:使用Postman进行接口测试与脚本编写

Postman 是一种流行的 API 测试工具&#xff0c;广泛应用于开发和测试过程中。它不仅可以用于手动测试&#xff0c;还支持自动化测试和脚本编写&#xff0c;以确保 API 的可靠性和性能。本文将详细介绍如何使用 Postman 进行接口测试与脚本编写&#xff0c;帮助你更高效地进行自…...

ONLYOFFICE 8.1 桌面编辑器测评:引领数字化办公新潮流

目录 前言 下载安装 新功能概述 1.PDF 编辑器的改进 2. 演示文稿中的幻灯片版式 3.语言支持的改进 4. 隐藏“连接到云”板块 5. 页面颜色设置和配色方案 界面设计&#xff1a;简洁大方&#xff0c;操作便捷 性能评测&#xff1a;稳定流畅&#xff0c;高效运行 办公环…...

基于大语言模型LangChain框架:知识库问答系统实践

ChatGPT 所取得的巨大成功&#xff0c;使得越来越多的开发者希望利用 OpenAI 提供的 API 或私有化模型开发基于大语言模型的应用程序。然而&#xff0c;即使大语言模型的调用相对简单&#xff0c;仍需要完成大量的定制开发工作&#xff0c;包括 API 集成、交互逻辑、数据存储等…...

解锁Transformer的鲁棒性:深入分析与实践指南

&#x1f6e1;️ 解锁Transformer的鲁棒性&#xff1a;深入分析与实践指南 Transformer模型自从由Vaswani等人在2017年提出以来&#xff0c;已经成为自然语言处理&#xff08;NLP&#xff09;领域的明星模型。然而&#xff0c;模型的鲁棒性——即模型在面对异常、恶意或不寻常…...

mybatis#号和$区别

在MyBatis中&#xff0c;#{}和${}都是用于实现动态SQL的占位符&#xff0c;但它们在使用场景和安全性上有明显的区别&#xff1a; 用途区别&#xff1a; #{}主要用于传递接口传输过来的具体数据&#xff0c;如参数值&#xff0c;它可以防止SQL注入&#xff0c;因为MyBatis会…...

AI绘画 Stable Diffusion【实战进阶】:图片的创成式填充,竖图秒变横屏壁纸!想怎么扩就怎么扩!

大家好&#xff0c;我是向阳。 所谓图片的创成式填充&#xff0c;就是基于原有图片进行扩展或延展&#xff0c;在保证图片合理性的同时实现与原图片的高度契合。是目前图像处理中常见应用之一。之前大部分都是通过PS工具来处理的。今天我们来看看在AI绘画工具 Stable Diffusio…...

Linux内核 -- 汇编结合ko案例之PMU获取cpu cycle技术

ARMv7汇编实现周期计数读取与清空 本文档详细描述了如何在ARMv7平台上使用汇编语言编写周期计数器读取与清空函数&#xff0c;如何在内核模块中导出这些函数供其他模块调用&#xff0c;以及如何使用Netlink接口供用户态程序进行调用。 1. 汇编函数实现 首先&#xff0c;编写…...

探索 Symfony 框架:工作原理、特点及技术选型

目录 1. 概述 2. Symfony 的工作原理 2.1 MVC 架构 2.2 前端控制器模式 2.3 路由机制 2.4 依赖注入容器 2.5 事件驱动架构 3. Symfony 的特点 3.1 高度可扩展性 3.2 强大的社区支持和生态系统 3.3 优秀的性能和可伸缩性 3.4 严格的代码规范和最佳实践 4. Symfony …...

从万里长城防御体系看软件安全体系建设@安全历史03

长城&#xff0c;是中华民族的一张重要名片&#xff0c;是中华民族坚韧不屈、自强不息的精神象征&#xff0c;被联合国教科文组织列入世界文化遗产名录。那么在古代&#xff0c;长城是如何以其复杂的防御体系&#xff0c;一次次抵御外族入侵&#xff0c;而这些防御体系又能给软…...

ISO 19110操作要求类中的/req/operation/formal-definition详细解释

/req/operation/formal-definition 要求: 每个要素操作实体必须具有一个形式定义&#xff08;formal definition&#xff09;&#xff0c;该定义应明确描述操作的行为和影响。 具体解释 定义 要素操作实体&#xff08;feature operation entity&#xff09;&#xff1a;这…...

豆包大语言模型API调用错误码一览表

本文介绍了您可能从 API 和官方 SDK 中看到的错误代码。 http code说明 400 原因&#xff1a;错误的请求&#xff0c;例如缺少必要参数&#xff0c;或者参数不符合规范等 解决方法&#xff1a;检查请求后重试 401 原因&#xff1a;认证错误&#xff0c;代表服务无法对请求进…...

AI辅助设计:如何通过机器学习革新创意工作流程

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法&#xff0c;大数据&#xff0c;深度学习 &#x1f492; 公众号…...

轻松解锁电脑强悍性能,4000MHz的玖合星舞 DDR4 内存很能打

轻松解锁电脑强悍性能&#xff0c;4000MHz的玖合星舞 DDR4 内存很能打 哈喽小伙伴们好&#xff0c;我是Stark-C~ 很多有经验的电脑玩家在自己DIY电脑选购内存条的时候&#xff0c;除了内存总容量&#xff0c;最看重的参数那就是频率了。内存频率和我们常说的CPU主频一样&…...

SpringBoot | 使用jwt令牌实现登录认证,使用Md5加密实现注册

对于登录认证中的令牌&#xff0c;其实就是一段字符串&#xff0c;那为什么要那么麻烦去用jwt令牌&#xff1f;其实对于登录这个业务&#xff0c;在平常我们实现这个功能时&#xff0c;可能大部分都是通过比对用户名和密码&#xff0c;只要正确&#xff0c;就登录成功&#xff…...

Springboot基于Redis的高性能分布式缓存数据库的实现与实例

一、引言 在现代的分布式系统和高并发应用中&#xff0c;缓存机制显得尤为重要。Redis作为一种开源&#xff08;BSD许可&#xff09;的内存键值存储&#xff0c;因其高性能、丰富的数据结构和多样化的应用场景&#xff0c;成为开发者们的首选。在这篇博客中&#xff0c;我们将…...

防止多次点击,vue的按钮上做简易的防抖节流处理

话不多说,上个视频,看看是不是你要的效果 防抖节流 1.创建一个directive.js // directive.js export default {install(Vue) {// 防重复点击(指令实现)Vue.directive(repeatClick, {inserted(el, binding) {el.addEventListener(click, () > {if (!el.disabled) {el.disabl…...

云计算【第一阶段(21)】Linux引导过程与服务控制

目录 一、linux操作系统引导过程 1.1、开机自检 1.2、MBR引导 1.3、GRUB菜单 1.4、加载 Linux 内核 1.5、init进程初始化 1.6、简述总结 1.7、初始化进程centos 6和7的区别 二、排除启动类故障 2.1、修复MBR扇区故障 2.1.1、 实验 2.2、修复grub引导故障 2.2.1、实…...

Google 发布最新开放大语言模型 Gemma 2,现已登陆 Hugging Face Hub

Google 发布了最新的开放大语言模型 Gemma 2&#xff0c;我们非常高兴与 Google 合作&#xff0c;确保其在 Hugging Face 生态系统中的最佳集成。你可以在 Hub 上找到 4 个开源模型 (2 个基础模型和 2 个微调模型) 。发布的功能和集成包括&#xff1a; Hub 上的模型https://hf.…...

智能分析赋能等保:大数据技术在安全审计记录中的应用

随着信息技术的飞速发展&#xff0c;大数据技术在各行各业中的应用愈发广泛&#xff0c;特别是在网络安全领域&#xff0c;大数据技术为安全审计记录提供了强有力的支撑。本文将深入探讨智能分析如何赋能等保&#xff08;等级保护&#xff09;&#xff0c;以及大数据技术在安全…...

Django中,update_or_create()

在Django中&#xff0c;可以使用update_or_create()方法来更新现有记录或创建新记录。该方法接受一个字典作为参数&#xff0c;用于指定要更新或创建的字段和对应的值。 update_or_create()方法的语法如下&#xff1a; 代码语言&#xff1a;python obj, created Model.obje…...

每日一学(1)

目录 1、ConCurrentHashMap为什么不允许key为null&#xff1f; 2、ThreadLocal会出现内存泄露吗&#xff1f; 3、AQS理解 4、lock 和 synchronized的区别 1、ConCurrentHashMap为什么不允许key为null&#xff1f; 底层 putVal方法 中 如果key || value为空 抛出…...

SpringMVC(1)——入门程序+流程分析

MVC都是哪三层&#xff1f;在Spring里面分别对应什么&#xff1f;SpringMVC的架构是什么&#xff1f; 我们使用Spring开发JavaWeb项目&#xff0c;一般都是BS架构&#xff0c;也就是Browser&#xff08;浏览器&#xff09;-Server&#xff08;服务器&#xff09;架构 这种架构…...

成绩发布背后:老师的无奈与痛点

在教育的广阔天地里&#xff0c;教师这一角色承载着无数的期望与责任。他们不仅是知识的传播者&#xff0c;更是学生心灵的引路人。而对于班主任老师来说&#xff0c;他们的角色更加多元&#xff0c;他们不仅是老师&#xff0c;还必须是“妈妈”。除了像其他老师一样备课、上课…...

MySQL 索引之外的相关查询优化总结

在这之前先说明几个概念&#xff1a; 1、驱动表和被驱动表&#xff1a;驱动表是主表&#xff0c;被驱动表是从表、非驱动表。驱动表和被驱动表并非根据 from 后面表名的先后顺序而确定&#xff0c;而是根据 explain 语句查询得到的顺序确定&#xff1b;展示在前面的是驱动表&am…...

EE trade:贵金属投资的优点及缺点

贵金属(如黄金、白银、铂金和钯金)一直以来都是重要的投资和避险工具。它们具有独特的物理和化学特性&#xff0c;广泛应用于各种行业&#xff0c;同时也被视为财富储备。在进行贵金属投资时&#xff0c;了解其优点和缺点对于做出明智的投资决策至关重要。 一、贵金属投资的优…...

python工作目录与文件目录

工作目录 文件目录&#xff1a;文件所在的目录 工作目录&#xff1a;执行python命令所在的目录 D:. | main.py | ---data | data.txt | ---model | | model.py | | train.py | | __init__.py | | | ---nlp | | | bert.py | …...

可信和可解释的大语言模型推理-RoG

大型语言模型&#xff08;LLM&#xff09;在复杂任务中表现出令人印象深刻的推理能力。然而&#xff0c;LLM在推理过程中缺乏最新的知识和经验&#xff0c;这可能导致不正确的推理过程&#xff0c;降低他们的表现和可信度。知识图谱(Knowledge graphs, KGs)以结构化的形式存储了…...

秋招季的策略与行动指南:提前布局,高效备战,精准出击

6月即将进入尾声&#xff0c;一年一度的秋季招聘季正在热火进行中。对于即将毕业的学生和寻求职业发展的职场人士来说&#xff0c;秋招是一个不容错过的黄金时期。 秋招的序幕通常在6月至9月间拉开&#xff0c;名企们纷纷开启网申的大门。在此期间&#xff0c;求职备战是一个系…...

Java并发编程-wait与notify详解及案例实战

文章目录 概述wait()notify()作用注意事项用wait与notify手写一个内存队列wait与notify的底层原理:monitor以及wait_setMonitor(监视器)Wait Set(等待集合)Wait() 原理Notify() / NotifyAll() 原理注意事项wait与notify在代码中使用时的注意事项总结案例实战:基于wait与not…...

204.贪心算法:分发饼干(力扣)

以下来源于代码随想录 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {// 对孩子的胃口进行排序sort(g.begin(), g.end());// 对饼干的尺寸进行排序sort(s.begin(), s.end());int index s.size() - 1; // 从最大的饼…...

AI奥林匹克竞赛:Claude-3.5-Sonnet对决GPT-4o,谁是最聪明的AI?

目录 实验设置 评估对象 评估方法 结果与分析 针对学科的细粒度分析 GPT-4o vs. Claude-3.5-Sonnet GPT-4V vs. Gemini-1.5-Pro 结论 AI技术日新月异&#xff0c;Anthropic公司最新发布的Claude-3.5-Sonnet因在知识型推理、数学推理、编程任务及视觉推理等任务上设立新…...

Qt/C++模拟鼠标键盘输入

1、控制鼠标移动 &#xff08;1&#xff09;Qt方案 QScreen* sc QGuiApplication::primaryScreen(); QCursor* c new QCursor(); int deltaX 10; int deltaY 10; c->setPos(sc, c->pos().x() deltaX, c->pos().y() deltaY);&#xff08;2&#xff09;Windows原…...

《后端程序猿 · 基于 Lettuce 实现缓存容错策略》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; 近期刚转战 CSDN&#xff0c;会严格把控文章质量&#xff0c;绝不滥竽充数&#xff0c;如需交流&#xff…...

linux环境安装elasticsearch缓存数据库和Kibana客户端

linux环境安装elasticsearch缓存数据库&#xff0c;今天我们安装7.17.18版本&#xff0c;并分析遇到的问题。 一、elasticsearch安装运行 1、直接下载 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.18-linux-x86_64.tar.gz2、解压 tar -…...

Redis 集群模式

一、集群模式概述 Redis 中哨兵模式虽然提高了系统的可用性&#xff0c;但是真正存储数据的还是主节点和从节点&#xff0c;并且每个节点都存储了全量的数据&#xff0c;此时&#xff0c;如果数据量过大&#xff0c;接近或超出了 主节点 / 从节点机器的物理内存&#xff0c;就…...

本地文件上传Github的方法

本文仅用于个人回忆本地文件上传GitHub方法&#xff0c;使用HTTP上传而不是SSH&#xff0c;其余文件已配置完成&#xff0c;如果你和我一样&#xff0c;那么请往下看&#xff0c;这条博客不说废话。 Step1 选择需要上传的文件&#xff0c;右键选择Git Bash Here Step2 创建一…...

从入口文件搭建php项目

入口文件index.php <?phprequire CallBack.php; // 处理回调请求逻辑 $bot new CallBack();// 请求方式 if (isset($_GET[method])) {$method $_GET[method];if (method_exists($bot, $method)) {return $bot->$method();} else {echo "没有该功能";die();…...

年轻化的新一代迈腾,颜值并不丑,三大屏高通8155

年轻化的新一代迈腾,颜值并不丑,三大屏高通8155,像新势力中国汽车市场的竞争是越来越激烈,要想脱颖而出,即便是合资品牌旗下的主力常青树车型,现在也要拥抱变化了。就拿大众迈腾这款车来说,长期以来已经形成了一套固定的印象标签,无非就是中规中矩的沉稳商务风格。但全…...

电动新浪潮:长安马自达CX-50与深蓝S7设计美学的较量

在电动化的浪潮中,汽车不仅是代步工具,更是个性与品味的展现。今天,我们将深入探讨两款电动SUV——长安马自达CX-50与深蓝S7,它们如何在设计美学上各领风骚,又如何在电动化的大潮中各显神通。随着环保理念的深入人心和政策的推动,电动车市场迎来了爆发式增长。消费者不再…...

C# 元组 Tuple

C# 元组 Tuple 元组创建元组访问元组元素命名元组元素元组的类型使用元组作为方法返回值 解构解构元组的基本用法解构部分元组解构方法 元组 在C#中&#xff0c;元组&#xff08;Tuple&#xff09;是一种数据结构&#xff0c;它允许你将多个值组合成一个单一的对象。 元组在处…...

【C++】模拟实现string类

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 一.了解项目功能 二.逐步实现项目功能模块及其逻辑详解 &#x1f38f;构建成员变量 &#x1f38f;实现string类默认成员函数 &#x1f4cc;构造函数 &#x1f4cc;析构函数…...

命令行如何设置openkylin os(UKUI)的壁纸

命令行执行 gsettings set org.mate.background picture-filename ‘path’ path就是图片路径 即可将path路径的图片设置为壁纸 我在研究做kylin的动态壁纸的时候发现的&#xff0c; gsettings set org.mate.background picture-filename ‘path’ 设置桌面背景纯色 gsetting…...

【深度 Q 学习-01】 Q学习概念和python实现

文章目录 一、说明二、深度 Q 学习概念三、python实现四、结论 关键词&#xff1a;Deep Q-Networks 一、说明 在强化学习 &#xff08;RL&#xff09; 中&#xff0c;Q 学习是一种基础算法&#xff0c;它通过学习策略来最大化累积奖励&#xff0c;从而帮助智能体导航其环境。它…...