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

【 开源:跨平台网络数据传输的万能工具libcurl】

在当今这个互联互通的世界中,数据在各种设备和平台之间自由流动,而 libcurl,就像一把跨平台的万能工具,为开发者提供了处理各种网络数据传输任务所需的强大功能。它不仅是一个库,更是一种通用的解决方案,可以应对从桌面应用到嵌入式系统等各种场景的挑战。

核心:libcurl 是什么?

libcurl 是一个免费、开源且高度可移植的客户端 URL 传输库 1。它支持广泛的协议,包括 HTTP(S)、FTP(S)、SCP、SFTP、TFTP、TELNET、LDAP(S)、MQTT、IMAP、POP3、SMTP、RTMP 和 RTSP。这意味着,无论你的应用需要与哪种类型的网络服务进行通信,libcurl 都能提供支持。

为什么 libcurl 如此受欢迎?

  • 广泛的协议支持: libcurl 支持几乎所有主流的网络协议,使其成为处理各种数据传输场景的理想选择 12。
  • 卓越的跨平台能力: 这是 libcurl 最重要的特性之一。 无论你的应用运行在 Windows、Linux、macOS、iOS、Android、FreeBSD、OpenBSD 甚至是嵌入式系统上,libcurl 都能提供一致的 API 和功能 1。这极大地简化了跨平台应用的开发和维护。
  • 高度的灵活性和可定制性: libcurl 提供了大量的选项,允许你精细地控制数据传输的各个方面,例如超时时间、重试次数、SSL 证书验证、HTTP 头设置等等。
  • 卓越的性能: libcurl 使用 C 语言编写,并经过了大量的优化,以提供卓越的性能。它还支持连接池、HTTP/2 和 HTTP/HTTP/3 等技术,进一步提升数据传输效率 2。
  • 强大的安全性: libcurl 支持 SSL/TLS 加密,并提供了各种安全选项,例如证书验证、主机名验证等,以确保数据传输的安全性。
  • 成熟度和稳定性: libcurl 已经存在了 20 多年,经过了无数项目的验证,是一个非常成熟和稳定的库 1。
  • 活跃的社区: libcurl 拥有一个庞大而活跃的社区,你可以从中获得支持、分享经验,并参与到 libcurl 的开发中。

libcurl 的高级特性 (不仅仅是下载文件)

  • 异步 API: libcurl 提供了异步 API,允许你在不阻塞主线程的情况下执行数据传输任务。这对于构建高性能的网络应用至关重要。
  • 多路复用: libcurl 支持多路复用技术,允许你在单个连接上同时传输多个数据流。这可以显著提高数据传输效率,尤其是在高并发场景下。
  • HTTP/2 和 HTTP/3: libcurl 支持最新的 HTTP/2 和 HTTP/3 协议,这些协议提供了更高的性能和更低的延迟。
  • WebSocket: libcurl 支持 WebSocket 协议,允许你构建实时的双向通信应用。
  • 自定义协议处理: libcurl 允许你自定义协议处理程序,以支持非标准的或私有的协议。

libcurl 的常见使用场景 (从 FTP 客户端到嵌入式系统)

  • 构建 FTP 客户端: 使用 libcurl 可以轻松地实现一个功能完善的 FTP 客户端,支持文件上传、下载、目录浏览等功能 15。
  • 开发 API 客户端: 许多应用需要与各种 Web API 进行交互,例如获取天气信息、发送消息、支付等等。libcurl 可以帮助你轻松地发送 HTTP 请求,并处理 API 返回的数据。
  • 实现网络爬虫: 网络爬虫需要抓取大量的网页内容。libcurl 可以帮助你高效地下载网页,并处理 Cookie、重定向等问题。
  • 在物联网 (IoT) 设备中使用: IoT 设备通常需要与云服务器进行通信,例如发送传感器数据、接收控制指令等等。libcurl 可以被移植到各种嵌入式系统中,用于实现网络数据传输功能。
  • 音视频流媒体: libcurl 可以用于实现音视频流媒体的客户端,支持 HTTP Live Streaming (HLS)、Dynamic Adaptive Streaming over HTTP (DASH) 等协议。
  • 游戏开发: 在线游戏需要与游戏服务器进行通信,例如发送玩家的位置信息、接收游戏状态更新等等。libcurl 可以用于实现这些网络通信功能。
  • 金融交易系统: 金融交易系统需要与交易所进行通信,例如发送交易指令、接收市场数据等等。libcurl 可以用于实现这些网络通信功能,并保证数据传输的安全性。

libcurl 的跨平台特性及安装使用

libcurl 的跨平台特性是其最大的优势之一。以下是在不同平台下安装和使用 libcurl 的简要说明:

  • Windows:
    • 安装: 可以从 https://curl.se/windows/ 下载预编译的 libcurl 二进制文件。
    • 使用: 在 Visual Studio 等 IDE 中,需要配置包含目录和库目录,并链接 libcurl.lib
  • Linux (Debian/Ubuntu):
    • 安装: 使用 apt-get 命令安装:sudo apt-get install libcurl4-openssl-dev
    • 使用: 在编译时,需要链接 libcurl 库:gcc your_program.c -lcurl
  • Linux (Red Hat/CentOS):
    • 安装: 使用 yum 命令安装:sudo yum install libcurl-devel
    • 使用: 在编译时,需要链接 libcurl 库:gcc your_program.c -lcurl

**libcurl 与 Qt 的完美结合 **

Qt 是一个强大的跨平台应用开发框架,提供了丰富的 GUI 组件和网络编程接口。虽然 Qt 提供了 QNetworkAccessManager 等网络编程类,但在某些情况下,libcurl 仍然是更好的选择。

  • 为什么在 Qt 中使用 libcurl?

    • 更底层的控制: libcurl 提供了更底层的控制,允许你精细地调整数据传输的各个方面。
    • 更广泛的协议支持: libcurl 支持一些 QNetworkAccessManager 不支持的协议,例如 SCP、SFTP 等。
    • 某些特定场景下的性能优势: 在某些特定场景下,libcurl 的性能可能优于 QNetworkAccessManager
  • 如何在 Qt 中使用 libcurl?

    1. 直接使用 libcurl 的 C API: 这是最常见的方式。你需要包含 curl/curl.h 头文件,并链接 libcurl 库。
    2. 使用 Qt 封装的 libcurl 库: 例如 QtilitiesKFTP。这些库提供了更 Qt 风格的 API,使用起来更方便。
    3. 使用 QProcess 调用 curl 命令行工具: 这种方式比较简单,但性能较差。
  • 示例代码:

    1. 直接使用 libcurl 的 C API:

    #include <QCoreApplication>
    #include <QDebug>
    #include <curl/curl.h>
    #include <QFile>size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp) {QFile *file = (QFile*)userp;return file->write((char*)buffer, size * nmemb);
    }int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);CURL *curl;CURLcode res;QFile file("output.txt");if (!file.open(QIODevice::WriteOnly)) {qDebug() << "Failed to open file for writing";return -1;}curl_global_init(CURL_GLOBAL_DEFAULT);curl = curl_easy_init();if(curl) {curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com");curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);curl_easy_setopt(curl, CURLOPT_WRITEDATA, &file);res = curl_easy_perform(curl);curl_easy_cleanup(curl);if(res == CURLE_OK) {qDebug() << "Download successful!";} else {qDebug() << "Error:" << curl_easy_strerror(res);}}curl_global_cleanup();file.close();return a.exec();
    }
    

    2. 使用 QProcess 调用 curl 命令行工具:

    #include <QCoreApplication>
    #include <QDebug>
    #include <QProcess>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QProcess process;QString program = "curl"; // 确保 curl 命令在系统 PATH 中QStringList arguments;arguments << "https://www.example.com" << "-o" << "output.html";process.start(program, arguments);process.waitForFinished();QByteArray output = process.readAllStandardOutput();QByteArray error = process.readAllStandardError();if (!error.isEmpty()) {qDebug() << "Error:" << error;} else {qDebug() << "Output:" << output;qDebug() << "Download successful!";}return a.exec();
    }
    

深入剖析 libcurl 的核心概念

  • CURL easy handle:

    • 作用: easy handle 是 libcurl 中最基本的概念,它代表一个独立的 HTTP(S)、FTP(S) 等协议的会话。你可以使用 easy handle 设置各种选项,例如 URL、请求方法、header、回调函数等。

    • 生命周期:

      1. 使用 curl_easy_init() 创建 easy handle。
      2. 使用 curl_easy_setopt() 设置 easy handle 的选项。
      3. 使用 curl_easy_perform() 执行数据传输。
      4. 使用 curl_easy_cleanup() 清理 easy handle。
    • 示例:

      CURL *curl = curl_easy_init();
      if(curl) {curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com");// ... 其他选项 ...CURLcode res = curl_easy_perform(curl);curl_easy_cleanup(curl);
      }
      
  • CURL multi handle:

    • 作用: multi handle 允许你同时管理多个 easy handle,实现并发传输。这可以显著提高下载速度,尤其是在下载多个小文件时。

    • 工作原理: multi handle 使用事件驱动机制,通过 select() 或 poll() 等系统调用监听 socket 事件,并在事件发生时调用相应的回调函数。

    • 示例:

      CURLM *multi_handle = curl_multi_init();
      CURL *easy_handle1 = curl_easy_init();
      CURL *easy_handle2 = curl_easy_init();curl_easy_setopt(easy_handle1, CURLOPT_URL, "https://www.example.com/file1.txt");
      curl_easy_setopt(easy_handle2, CURLOPT_URL, "https://www.example.com/file2.txt");curl_multi_add_handle(multi_handle, easy_handle1);
      curl_multi_add_handle(multi_handle, easy_handle2);int still_running = 0;
      do {CURLMcode mc = curl_multi_perform(multi_handle, &still_running);if(mc) {// 处理错误}// 等待 socket 事件// ...
      } while(still_running);curl_multi_remove_handle(multi_handle, easy_handle1);
      curl_multi_remove_handle(multi_handle, easy_handle2);
      curl_easy_cleanup(easy_handle1);
      curl_easy_cleanup(easy_handle2);
      curl_multi_cleanup(multi_handle);
      
  • CURL share handle:

    • 作用: share handle 允许你在多个 easy handle 之间共享会话信息,例如 Cookie、SSL 会话等。这可以避免重复的握手和认证过程,提高性能。

    • 线程安全: share handle 本身不是线程安全的,需要在多线程环境中使用锁来保护共享资源。

    • 示例:

      CURLSH *share_handle = curl_share_init();
      curl_share_setopt(share_handle, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
      curl_share_setopt(share_handle, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);CURL *easy_handle1 = curl_easy_init();
      CURL *easy_handle2 = curl_easy_init();curl_easy_setopt(easy_handle1, CURLOPT_SHARE, share_handle);
      curl_easy_setopt(easy_handle2, CURLOPT_SHARE, share_handle);// ...curl_easy_cleanup(easy_handle1);
      curl_easy_cleanup(easy_handle2);
      curl_share_cleanup(share_handle);
      
  • CURLcode:

    • 作用: CURLcode 是 libcurl 函数返回的错误码,用于指示函数执行的结果。

    • 常见错误码:

      • CURLE_OK (0): 一切正常。
      • CURLE_UNSUPPORTED_PROTOCOL (1): 不支持的协议。
      • CURLE_BAD_URL (2): URL 格式错误。
      • CURLE_COULDNT_RESOLVE_HOST (6): 无法解析主机名。
      • CURLE_COULDNT_CONNECT (7): 无法连接到服务器。
      • CURLE_HTTP_RETURNED_ERROR (22): HTTP 请求返回错误码(例如 404、500)。
      • CURLE_SSL_CONNECT_ERROR (35): SSL 连接错误。
      • CURLE_OPERATION_TIMEDOUT (28): 操作超时。
    • 示例:

      CURLcode res = curl_easy_perform(curl);
      if(res != CURLE_OK) {std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
      }
      

7. 实际案例分析

  • 案例 1:开发一个简单的 HTTP 客户端

    这个案例演示了如何使用 libcurl 开发一个简单的 HTTP 客户端,可以发送 GET 和 POST 请求,并处理 HTTP 响应。

    #include <iostream>
    #include <string>
    #include <curl/curl.h>// 回调函数,用于接收 HTTP 响应数据
    size_t WriteCallback(void *contents, size_t size, size_t nmemb, std::string *output) {size_t total_size = size * nmemb;output->append((char*)contents, total_size);return total_size;
    }int main() {CURL *curl;CURLcode res;std::string readBuffer;// 初始化 libcurlcurl_global_init(CURL_GLOBAL_DEFAULT);// 创建一个 curl handlecurl = curl_easy_init();if(curl) {// 设置要请求的 URLcurl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com");// 设置 write callback 函数curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);// 执行 HTTP 请求res = curl_easy_perform(curl);if(res != CURLE_OK) {std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;} else {std::cout << "HTTP Response:\n" << readBuffer << std::endl;}// 清理 curl handlecurl_easy_cleanup(curl);}// 清理 libcurlcurl_global_cleanup();return 0;
    }
    
  • 案例 2:实现一个多线程下载器 (简要示例)

    这个案例演示了如何使用 libcurl 和 Qt 的多线程功能实现一个简单的多线程下载器。由于完整的多线程下载器代码较长,这里只提供一个简要的示例,展示如何使用 curl_multi_perform 实现并发下载。

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    #include <thread>
    #include <mutex>
    #include <curl/curl.h>// 下载任务结构体
    struct DownloadTask {std::string url;std::string filename;};// 下载函数void DownloadFile(DownloadTask task) {CURL *curl;FILE *fp;CURLcode res;curl = curl_easy_init();if (curl) {fp = fopen(task.filename.c_str(), "wb");if (fp) {curl_easy_setopt(curl, CURLOPT_URL, task.url.c_str());curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL);curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);res = curl_easy_perform(curl);fclose(fp);if (res != CURLE_OK) {std::cerr << "Download failed: " << curl_easy_strerror(res) << std::endl;} else {std::cout << "Download complete: " << task.filename << std::endl;}} else {std::cerr << "Failed to open file: " << task.filename << std::endl;}curl_easy_cleanup(curl);}}int main() {// 下载任务列表std::vector<DownloadTask> tasks = {{"https://www.example.com/file1.zip", "file1.zip"},{"https://www.example.com/file2.zip", "file2.zip"},{"https://www.example.com/file3.zip", "file3.zip"}};// 创建线程std::vector<std::thread> threads;for (auto &task : tasks) {threads.emplace_back(DownloadFile, task);}// 等待线程结束for (auto &thread : threads) {thread.join();}return 0;}```
  • 最佳实践 (Qt + libcurl):

    • 使用 Qt 的信号和槽机制处理异步操作: 可以将 libcurl 的异步 API 与 Qt 的信号和槽机制结合使用,以实现非阻塞的网络编程。
    • 使用 Qt 的数据类型: 可以使用 QByteArrayQString 等 Qt 的数据类型来处理 libcurl 返回的数据。
    • 注意线程安全: libcurl 不是完全线程安全的,需要在多线程环境中使用锁来保护共享资源。
    • 选择合适的封装库: 如果你希望使用更 Qt 风格的 API,可以考虑使用 QtilitiesKFTP 等封装库。
  • 使用场景示例:

    • 下载大文件: 使用 libcurl 可以更灵活地控制下载过程,例如支持断点续传、限速下载等。

    • 与 SCP/SFTP 服务器进行通信: QNetworkAccessManager 不支持 SCP/SFTP 协议,可以使用 libcurl 来实现这些功能。

    • 实现自定义的网络协议: 如果你需要实现自定义的网络协议,可以使用 libcurl 的自定义协议处理程序。

      libcurl 不仅仅是一个库,它是一种思想,一种解决网络数据传输问题的通用方法。无论你是开发桌面应用、移动应用、嵌入式系统还是其他类型的应用,libcurl 都能为你提供强大的支持,帮助你构建更高效、更安全、更可靠的网络应用。掌握 libcurl 的使用,将使你成为一名更出色的跨平台开发者。

参考链接

  • libcurl 官网: https://curl.se/libcurl/
  • curl 官网: https://curl.se/
  • curl GitHub 仓库: https://github.com/curl/curl
  • libcurl tutorial: https://curl.se/docs/tutorial.html

以上部分内容由AI辅助整理完成,文中部分代码暂未经过验证,请谨慎使用。后续将持续更新代码验证情况。

相关文章:

【 开源:跨平台网络数据传输的万能工具libcurl】

在当今这个互联互通的世界中&#xff0c;数据在各种设备和平台之间自由流动&#xff0c;而 libcurl&#xff0c;就像一把跨平台的万能工具&#xff0c;为开发者提供了处理各种网络数据传输任务所需的强大功能。它不仅是一个库&#xff0c;更是一种通用的解决方案&#xff0c;可…...

2025版 JavaScript性能优化实战指南从入门到精通

JavaScript作为现代Web应用的核心技术&#xff0c;其性能直接影响用户体验。本文将深入探讨JavaScript性能优化的各个方面&#xff0c;提供可落地的实战策略。 一、代码层面的优化 1. 减少DOM操作 DOM操作是JavaScript中最昂贵的操作之一&#xff1a; // 不好的做法&#x…...

RAGFlow知识检索原理解析:混合检索架构与工程实践

一、核心架构设计 RAGFlow构建了四阶段处理流水线,其检索系统采用双路召回+重排序的混合架构: S c o r e f i n a l = α ⋅ B M...

leetcode 148. Sort List

148. Sort List 题目描述 代码&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNod…...

C#学习11——集合

一、集合 是一组对象的容器&#xff0c;提供了高效的存储、检索和操作数据的方式。 C# 集合分为泛型集合&#xff08;推荐使用&#xff09;和非泛型集合&#xff0c;主要位于System.Collections和System.Collections.Generic命名空间中。 二、集合有哪些&#xff1f; 1&…...

paddlehub搭建ocr服务

搭建环境&#xff1a; Ubuntu20.041080Ti显卡 由于GPU硬件比较老&#xff0c;是Pascal架构&#xff0c;只能支持到paddle2.4.2版本&#xff0c;更高版本无法支持&#xff1b;同时&#xff0c;因为paddle老版本的依赖发生了变化&#xff0c;有些地方存在冲突&#xff0c;花费了…...

CSS3过渡

一、什么是CSS3过渡 CSS3 过渡&#xff08;transitions&#xff09;是一种效果&#xff0c;它允许你平滑地改变CSS属性的值&#xff0c;从一个状态过渡到另一个状态。是一种动画转换的过程&#xff0c;如渐现、渐弱、动画快慢等。过渡效果可以在用户与页面进行交互时触发&#…...

比斯特自动化|移动电源全自动点焊机:高效点焊助力移动电源制造

在移动电源市场蓬勃发展的当下&#xff0c;电池组合的点焊工艺要求愈发严格。移动电源全自动点焊机应运而生&#xff0c;成为提升生产效率与产品质量的关键设备。 工作原理与结构组成 移动电源全自动点焊机通过瞬间放电产生高温&#xff0c;使电池极耳与镍带等材料在极短时间…...

游戏引擎学习第305天:在平台层中使用内存 Arena 的方法与思路

回顾前一天内容&#xff0c;并为今天的开发工作设定方向 我们正在直播制作完整游戏&#xff0c;当前正在实现一个精灵图&#xff08;sprite graph&#xff09;的排序系统。排序的代码已经写完&#xff0c;过程并不复杂&#xff0c;虽然还没做太多优化&#xff0c;但总体思路比…...

[Java][Leetcode middle] 6. Z 字形变换

法一&#xff0c;自己想的 使用一个复合结构的 List<ArrayList<String>> 来存储每一行的字母&#xff0c;最后按序输出。 使用flag来判断到底放到哪一行上去。flag按照&#xff1a;0–1–2–1–0–1–2这样变化&#xff0c;实现躺着的Z字形。 public String conve…...

零基础设计模式——第二部分:创建型模式 - 原型模式

第二部分&#xff1a;创建型模式 - 5. 原型模式 (Prototype Pattern) 我们已经探讨了单例、工厂方法、抽象工厂和生成器模式。现在&#xff0c;我们来看创建型模式的最后一个主要成员——原型模式。这种模式关注的是通过复制现有对象来创建新对象&#xff0c;而不是通过传统的…...

完整改进RIME算法,基于修正多项式微分学习算子Rime-ice增长优化器,完整MATLAB代码获取

1 简介 为了有效地利用雾状冰生长的物理现象&#xff0c;最近开发了一种优化算法——雾状优化算法&#xff08;RIME&#xff09;。它模拟硬雾状和软雾状过程&#xff0c;构建硬雾状穿刺和软雾状搜索机制。在本研究中&#xff0c;引入了一种增强版本&#xff0c;称为修改的RIME…...

【1——Android端添加隐私协议(unity)1/3】

前言&#xff1a;这篇仅对于unity 发布Android端上架国内应用商店添加隐私协议&#xff0c;隐私协议是很重要的东西&#xff0c;没有这个东西&#xff0c;是不上了应用商店的。 对于仅仅添加隐私协议&#xff0c;我知道有三种方式,第一种和第二种基本一样 1.直接在unity里面新…...

笔记本6GB本地可跑的图生视频项目(FramePack)

文章目录 &#xff08;一&#xff09;简介&#xff08;二&#xff09;本地执行&#xff08;2.1&#xff09;下载&#xff08;2.2&#xff09;更新&#xff08;2.3&#xff09;运行&#xff08;2.4&#xff09;生成 &#xff08;三&#xff09;注意&#xff08;3.1&#xff09;效…...

Android View的事件分发机制

ViewGroup的事件分发逻辑 从Activity传递给Window&#xff0c;再传递给ViewGroup&#xff0c;ViewGroup的dispatchTouchEvent()会被调用&#xff0c;如果onInterceptTouchEvent()返回true 转交自身onTouchEvent()处理,如果返回false继续向子View传递,子View的dispatchTouchEve…...

Python字符串格式化(二): f-string的进化

文章目录 一、Python 3.6&#xff1a;重新发明字符串格式化&#xff08;2016&#xff09;1. 语法糖的诞生&#xff1a;表达式直嵌技术2. 性能与可读性的双重提升3. 奠定现代格式化的基础架构 二、Python 3.7&#xff1a;解锁异步编程新场景&#xff08;2018&#xff09;1. 异步…...

力扣HOT100之二叉树:124. 二叉树中的最大路径和

这道题是困难题&#xff0c;靠自己想还是挺难想的&#xff0c;还是去看的灵神的题解&#xff0c;感觉还是要多复习一下这道题。这道题的思路和之前做的543. 二叉树的直径很像&#xff0c;可以参考之前的这篇博客。这里我们还是用递归来做&#xff0c;定义一个lambda函数来实现递…...

【C++】位图+布隆过滤器

1.位图 概念 所谓位图&#xff0c;就是用每一位来存放某种状态&#xff0c;适用于海量数据&#xff0c;数据无重复的场景。通常是用来判断某个数据存不存在的或是否被标记。 1.二进制位表示 &#xff1a; 位图中的每一位&#xff08;bit&#xff09;代表一个元素的状态。通常&…...

Google Agent Development Kit与MCP初试

Google Agent Development Kit与MCP初试 一、背景知识二、搭建智能大脑 - Ollama服务器2.1 为什么要先搭建Ollama&#xff1f;2.2 搭建ollama服务器2.2.1 安装2.2.2 试着用curl命令"问"AI一个问题&#xff1a; 三、构建智能体工坊 - ADK环境3.1 创建容器3.2 安装核心…...

云原生+大数据

虚拟化&#xff1a; 虚拟化&#xff0c;是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机&#xff0c;每个逻辑计算机可运行不同的操作系统&#xff0c;并且应用程序都可以在相互独立的空间内运行而互不影响&#xff0c;从而显著提…...

基于cornerstone3D的dicom影像浏览器 第二十一章 显示DICOM TAGS

系列文章目录 第一章 下载源码 运行cornerstone3D example 第二章 修改示例crosshairs的图像源 第三章 vitevue3cornerstonejs项目创建 第四章 加载本地文件夹中的dicom文件并归档 第五章 dicom文件生成png&#xff0c;显示检查栏&#xff0c;序列栏 第六章 stack viewport 显…...

【记录】PPT|PPT打开开发工具并支持Quicker VBA运行

文章目录 打开开发者工具支持Quicker VBA运行 打开开发者工具 参考文章&#xff0c;微软文档&#xff1a;显示“开发工具”选项卡&#xff0c;以下直接复制&#xff0c;如侵私删。 适用对象&#xff1a;Microsoft 365 专属 Excel Microsoft 365 专属 Outlook Microsoft 365 专属…...

西门子 S1500 博途软件舞台威亚 3D 控制方案

西门子 S1500 PLC 是工业自动化领域的主流控制器&#xff0c;适合高精度、高可靠性的舞台威亚控制。下面为你提供基于博途 (TIA Portal) 软件的 3D 控制方案设计。 系统架构设计 舞台威亚 3D 控制系统通常包含以下组件&#xff1a; 硬件层&#xff1a; S1500 PLC 主机伺服驱动…...

第三十二天打卡

import pandas as pd from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier # 加载鸢尾花数据集 iris load_iris() df pd.DataFrame(iris.data, columnsiris.feature_names) …...

同步/异步电路;同步/异步复位

同步/异步电路&#xff1b;同步/异步复位 在 FPGA 设计中&#xff0c;同步电路、异步电路、同步复位和异步复位是基础且关键的概念&#xff0c;它们的特性直接影响电路的可靠性、时序性能和设计复杂度。 一、同步电路&#xff08;Synchronous Circuit&#xff09; 定义 同步电…...

spring boot 实现resp视频推流

1、搭建resp服务&#xff08;docker方式&#xff09; docker pull aler9/rtsp-simple-serverdocker run -d --restartalways \--name rtsp-server \-p 8554:8554 \aler9/rtsp-simple-server2、maven依赖 <dependency><groupId>org.bytedeco</groupId><a…...

python、R、shell兼容1

一&#xff0c;兼容方式 1&#xff0c;shell中用R、python&#xff1a; &#xff08;1&#xff09;python3、R/r&#xff08;radian&#xff09;进入 &#xff08;2&#xff09;脚本封装&#xff1a;命令行或者封装到sh脚本中 python xxx.py 自定义参数 Rscript xxx.r 自…...

Oracle 11G RAC重启系统异常

vmware安装centos7环境部署Oracle RAC (11.2.0.4) 部署时所有资源情况都是正常的&#xff0c;关机重启虚拟机后集群资源状态异常&#xff0c;请教CSDN大佬 – 部署规划 域名地址备注rac16192.168.31.16rac17192.168.31.17rac16vip192.168.31.26viprac17vip192.168.31.27vip…...

便捷的电脑自动关机辅助工具

软件介绍 本文介绍的软件是一款电脑上实用的倒计时和关机助手。 软件特性 这款关机助手十分贴心&#xff0c;它是一款无需安装的小软件&#xff0c;体积仅60KB&#xff0c;不用担心占用电脑空间&#xff0c;打开即可直接使用。 操作方法 你只需设置好对应的关机时间&#x…...

巧用 FFmpeg 命令行合并多个视频为一个视频文件教程

你是否曾经遇到过需要将多个视频片段合并成一个连续视频的情况&#xff1f;比如&#xff0c;你拍摄了一段旅行的精彩瞬间&#xff0c;想把它们合成一部短片&#xff1b;或者你在制作教学视频时&#xff0c;希望将不同的部分整合在一起。这时候&#xff0c;FFmpeg 就是你的得力助…...

平时使用电脑,如何去维护

在这个数字化的时代&#xff0c;电脑已经成为我们生活和工作中不可或缺的一部分。然而&#xff0c;你是否知道如何正确地维护它&#xff0c;让它始终保持良好的运行状态呢&#xff1f;今天&#xff0c;就让我来为大家揭晓这个谜底。定期清理电脑内部和外部的灰尘是至关重要的。…...

(视觉)分类、检测与分割在不同网络中的设计体现

分类、检测与分割在不同网络中的设计体现 概述 在计算机视觉领域&#xff0c;不同的网络结构在功能和结构上差异显著&#xff0c;同时也共享一些基础设计元素。 卷积神经网络是基石&#xff1a; 卷积层通过特定的卷积核与图像进行卷积运算提取图像中的局部特征&#xff0c;比…...

技术分享 | MySQL大事务导致数据库卡顿

本文为墨天轮数据库管理服务团队第66期技术分享&#xff0c;内容原创&#xff0c;作者为技术顾问孙文龙&#xff0c;如需转载请联系小墨&#xff08;VX&#xff1a;modb666&#xff09;并注明来源。 一、现 象 业务侧反馈连接数据库异常&#xff0c;报错 connection is not av…...

C#在 .NET 9.0 中启用二进制序列化:配置、风险与替代方案

在 .NET 9.0 中启用二进制序列化&#xff1a;配置、风险与替代方案 引言一、启用二进制序列化的步骤二、实现序列化与反序列化三、安全风险与缓解措施四、推荐替代方案五、总结 引言 在 .NET 生态中&#xff0c;二进制序列化&#xff08;Binary Serialization&#xff09;曾是…...

每日Prompt:像素风格插画

提示词 像素风格插画&#xff0c;日式漫画脸&#xff0c;画面主体为一位站在路边的男孩&#xff0c;人物穿着黑色冲锋衣&#xff0c;手里拿着手机&#xff0c;男孩靠坐在机车旁边&#xff0c;脚边依偎着一只带着小摩托车头盔的小小猫&#xff0c;背景是雨中&#xff0c;身旁停…...

Rust 学习笔记:生命周期

Rust 学习笔记&#xff1a;生命周期 Rust 学习笔记&#xff1a;生命周期使用生命周期防止悬空引用借用检查器函数中的泛型生命周期生命周期注释语法函数签名中的生命周期注解从生命周期的角度思考结构定义中的生命周期注解省略生命周期方法定义中的生命周期注释静态生命周期泛型…...

科学标注法:数据治理的未来之路

在数据治理领域,科学标注法是一种系统化、标准化的数据标注方法论,其核心是通过规范化的流程、技术工具和质量控制机制,将原始数据转化为具有语义和结构特征的可用数据资源。以下从定义、技术特征、应用场景、与传统标注方法的区别以及遵循的标准框架等方面展开详细解析: 一…...

小白刷题 之 如何高效计算二进制数组中最大连续 1 的个数

前言 学习如何快速找出二进制数组中最长的连续 1 序列。 这个问题在数据处理、网络传输和算法面试中经常出现&#xff0c;掌握它不仅能提升编程能力&#xff0c;还能加深对数组操作和循环控制的理解。 &#x1f31f; 问题背景 想象你是一位网络工程师&#xff0c;正在分析服…...

中科方德鸳鸯火锅平台使用教程:轻松运行Windows应用!

原文链接&#xff1a;中科方德鸳鸯火锅平台使用教程&#xff1a;轻松运行Windows应用&#xff01; Hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇中科方德鸳鸯火锅平台使用的文章&#xff0c;欢迎大家分享点赞&#xff0c;点个在看和关注吧&#xff01;在信创环境…...

完全禁用 Actuator 功能

问题描述&#xff1a; springboot 关闭Actuator无效&#xff0c;原本设置 management:endpoints:enabled-by-default: false # 禁用所有端点屏蔽了/actuator/info和/actuator/health&#xff0c;但/actuator还可以访问。 拉满配置如下&#xff0c;成功屏蔽 # application.y…...

Netty学习专栏(二):Netty快速入门及重要组件详解(EventLoop、Channel、ChannelPipeline)

文章目录 前言一、快速入门&#xff1a;5分钟搭建Echo服务器二、核心组件深度解析2.1 EventLoop&#xff1a;颠覆性的线程模型EventLoop 设计原理核心 API 详解代码实践&#xff1a;完整使用示例 2.2 Channel&#xff1a;统一的网络抽象层Channel 核心架构核心 API 详解代码实践…...

27-FreeRTOS的任务管理

一、FreeRTOS的任务概念 在FreeRTOS中&#xff0c;任务&#xff08;Task&#xff09;是操作系统调度的基本单位。每个任务都是一个无限循环的函数&#xff0c;它执行特定的功能。任务可以被看作是一个轻量级的线程&#xff0c;具有自己的堆栈和优先级。下面是如何定义一个任务函…...

upload-labs靶场通关详解:第14关

一、分析源代码 这一关的任务说明已经相当于给出了答案&#xff0c;就是让我们上传一个图片木马&#xff0c;可以理解为图片中包含了一段木马代码。 function getReailFileType($filename){$file fopen($filename, "rb");$bin fread($file, 2); //只读2字节fclose…...

supervisor的进程监控+prometheus+alertmanager实现告警

supervisor服务进程监控实现告警 前提&#xff1a;部署了prometheus(配置了rules文件夹),alertmanager,webhook,python3环境 [roottest supervisor_prometheus]# pwd /opt/supervisor_prometheus [roottest supervisor_prometheus]# ls supervisor_exporter.py supervisor_int…...

HarmonyOS 鸿蒙应用开发基础:父组件调用子组件方法的几种实现方案对比

在ArkUI声明式UI框架中&#xff0c;父组件无法直接调用子组件的方法。本文介绍几种优雅的解决方案&#xff0c;并作出对比分析&#xff0c;分析其适用于不同场景和版本需求。帮助开发者在开发中合理的选择和使用。 方案一&#xff1a;Watch装饰器&#xff08;V1版本适用&#x…...

Enhancing Relation Extractionvia Supervised Rationale Verifcation and Feedback

Enhancing Relation Extraction via Supervised Rationale Verification and Feedback| Proceedings of the AAAI Conference on Artificial Intelligencehttps://ojs.aaai.org/index.php/AAAI/article/view/34631 1. 概述 关系抽取(RE)任务旨在抽取文本中实体之间的语义关...

等离子体隐身技术和小型等离子体防御装置设计

相信大家前不久都看到了关于国防科大团队关于等离子体防御的相关文章&#xff0c;恰好也在做相关的研究&#xff0c;所以想向对这个问题感兴趣的朋友聊一聊这里面的一些基本原理和研究现状。 等离子体与电磁波的相互作用 等离子体会对电磁波产生吸收和反射作用&#xff0c;通常…...

PCB设计教程【入门篇】——电路分析基础-电路定理

前言 本教程基于B站Expert电子实验室的PCB设计教学的整理&#xff0c;为个人学习记录&#xff0c;旨在帮助PCB设计新手入门。所有内容仅作学习交流使用&#xff0c;无任何商业目的。若涉及侵权&#xff0c;请随时联系&#xff0c;将会立即处理 一、电路基本概念 连接线与节点 …...

C++-继承

1.继承的概念及定义 1.1继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象 程序设计的层…...

25.5.22学习总结

ST表&#xff08;Sparse Table&#xff0c;稀疏表&#xff09;是一种用于高效解决静态区间最值查询&#xff08;RMQ&#xff09;问题的数据结构。其核心思想是通过预处理每个长度为2^j的区间的最值&#xff0c;使得查询时只需合并两个子区间的最值即可得到结果&#xff0c;从而…...