Qt/C++ 调用迅雷开放下载引擎(ThunderOpenSDK)下载数据资源
目录导读
- 前言
- ThunderOpenSDK 简介
- 参考 xiaomi_Thunder_Cloud 示例
- ThunderOpenSDK 下载问题
前言
在对以前老版本的exe执行程序进行研究学习的时候,发现以前的软件是使用的ThunderOpenSDK这个迅雷开放下载引擎进行的项目数据下载,于是在网上搜索一番找到了相关内容,但是不知道为什么了相关资料相当少,不过用是真的好用,于是仔细的研究了一下。
ThunderOpenSDK 简介
ThunderOpenSDK 是一个迅雷开放下载引擎的 SDK,允许开发者在自己的应用程序中集成迅雷的下载功能。该 SDK 提供了丰富的接口,支持多种下载任务的管理,包括任务的创建、启动、停止、删除等操作。此外,SDK 还支持设置下载速度限制、代理、用户代理等功能,以满足不同应用场景的需求。
出自:ThunderOpenSDK 使用教程
相关内容参考:
迅雷开放下载引擎(ThunderOpenSDK)使用指南
ThunderOpenSDK 使用教程
配置云平台ip和端口 云平台接口
GitHub: ThunderOpenSDK
ThunderOpenSDK 不需要再进行编译,直接附加到项目中就能直接使用,甚至示例程序都写好了,只管调用。
GitHub示例中有0.CurUseCommonLib,360Jisu_Thunder_Cloud,liebao_Thunder_Cloud,xiaomi_Thunder_Cloud,XunleiDownload_Old 5个版本的示例,
可以根据需求任选一个

通过查看xldl.dll文件的属性信息和Github上的声明,
我都毫不怀疑这些库文件是不是是从某个软件上扒下来的。
参考 xiaomi_Thunder_Cloud 示例
以xiaomi_Thunder_Cloud 迅雷云加速开发平台版本示例;

打开xldl.h文件可以发现xldl.dll的接口和数据结构都已经声明好还有注释,只管调用:
- xldl.h:
#pragma once// 所有结构体定义按1字节对齐
#pragma pack(push, 1)
struct DownTaskParam
{DownTaskParam(){memset(this, 0, sizeof(DownTaskParam));nReserved1 = 5;bReserved = FALSE;DisableAutoRename = FALSE;IsOnlyOriginal = FALSE;IsResume = TRUE;}int nReserved;wchar_t szTaskUrl[2084]; // 任务URLwchar_t szRefUrl[2084]; // 引用页wchar_t szCookies[4096]; // 浏览器cookiewchar_t szFilename[MAX_PATH]; // 下载保存文件名.wchar_t szReserved0[MAX_PATH];wchar_t szSavePath[MAX_PATH]; // 文件保存目录HWND hReserved;BOOL bReserved; wchar_t szReserved1[64];wchar_t szReserved2[64];BOOL IsOnlyOriginal; // 是否只从原始地址下载UINT nReserved1;BOOL DisableAutoRename; // 禁止智能命名BOOL IsResume; // 是否用续传DWORD reserved[2048];
};
enum DOWN_TASK_STATUS
{NOITEM = 0,TSC_ERROR,TSC_PAUSE,TSC_DOWNLOAD,TSC_COMPLETE,TSC_STARTPENDING,TSC_STOPPENDING
};
enum TASK_ERROR_TYPE
{TASK_ERROR_UNKNOWN = 0x00, // 未知错误TASK_ERROR_DISK_CREATE = 0x01, // 创建文件失败TASK_ERROR_DISK_WRITE = 0x02, // 写文件失败TASK_ERROR_DISK_READ = 0x03, // 读文件失败TASK_ERROR_DISK_RENAME = 0x04, // 重命名失败TASK_ERROR_DISK_PIECEHASH = 0x05, // 文件片校验失败TASK_ERROR_DISK_FILEHASH = 0x06, // 文件全文校验失败TASK_ERROR_DISK_DELETE = 0x07, // 删除文件失败失败TASK_ERROR_DOWN_INVALID = 0x10, // 无效的DOWN地址TASK_ERROR_PROXY_AUTH_TYPE_UNKOWN = 0x20, // 代理类型未知TASK_ERROR_PROXY_AUTH_TYPE_FAILED = 0x21, // 代理认证失败TASK_ERROR_HTTPMGR_NOT_IP = 0x30, // http下载中无ip可用TASK_ERROR_TIMEOUT = 0x40, // 任务超时TASK_ERROR_CANCEL = 0x41, // 任务取消TASK_ERROR_TP_CRASHED= 0x42, // MINITP崩溃TASK_ERROR_ID_INVALID = 0x43, // TaskId 非法
};
struct DownTaskInfo
{DownTaskInfo(){memset(this, 0, sizeof(DownTaskInfo));stat = TSC_PAUSE;fail_code = TASK_ERROR_UNKNOWN;fPercent = 0;bIsOriginUsable = false;fHashPercent = 0;}DOWN_TASK_STATUS stat;TASK_ERROR_TYPE fail_code;wchar_t szFilename[MAX_PATH];wchar_t szReserved0[MAX_PATH];__int64 nTotalSize; // 该任务总大小(字节)__int64 nTotalDownload; // 下载有效字节数(可能存在回退的情况)float fPercent; // 下载进度int nReserved0;int nSrcTotal; // 总资源数int nSrcUsing; // 可用资源数int nReserved1;int nReserved2;int nReserved3;int nReserved4;__int64 nReserved5;__int64 nDonationP2P; // p2p贡献字节数__int64 nReserved6;__int64 nDonationOrgin; // 原始资源共享字节数__int64 nDonationP2S; // 镜像资源共享字节数__int64 nReserved7;__int64 nReserved8;int nSpeed; // 即时速度(字节/秒)int nSpeedP2S; // 即时速度(字节/秒)int nSpeedP2P; // 即时速度(字节/秒)bool bIsOriginUsable; // 原始资源是否有效float fHashPercent; // 现不提供该值int IsCreatingFile; // 是否正在创建文件DWORD reserved[64];
};
enum DOWN_PROXY_TYPE
{PROXY_TYPE_IE = 0,PROXY_TYPE_HTTP = 1,PROXY_TYPE_SOCK4 = 2,PROXY_TYPE_SOCK5 = 3,PROXY_TYPE_FTP = 4,PROXY_TYPE_UNKOWN = 255,
};
enum DOWN_PROXY_AUTH_TYPE
{PROXY_AUTH_NONE =0,PROXY_AUTH_AUTO,PROXY_AUTH_BASE64,PROXY_AUTH_NTLM,PROXY_AUTH_DEGEST,PROXY_AUTH_UNKOWN,
};
struct DOWN_PROXY_INFO
{BOOL bIEProxy;BOOL bProxy;DOWN_PROXY_TYPE stPType;DOWN_PROXY_AUTH_TYPE stAType;wchar_t szHost[2048];INT32 nPort;wchar_t szUser[50];wchar_t szPwd[50];wchar_t szDomain[2048];
};
struct WSAPROTOCOL_INFOW;#pragma pack(pop)namespace DownEngine
{extern "C" __declspec(dllimport) BOOL XL_Init(void);extern "C" __declspec(dllimport) BOOL XL_UnInit(void);extern "C" __declspec(dllimport) HANDLE XL_CreateTask(DownTaskParam &stParam);extern "C" __declspec(dllimport) BOOL XL_DeleteTask(HANDLE hTask);extern "C" __declspec(dllimport) BOOL XL_StartTask(HANDLE hTask);extern "C" __declspec(dllimport) BOOL XL_StopTask(HANDLE hTask);extern "C" __declspec(dllimport) BOOL XL_ForceStopTask(HANDLE hTask);extern "C" __declspec(dllimport) BOOL XL_QueryTaskInfo(HANDLE hTask, DownTaskInfo & stTaskInfo); //旧版接口,使用Ex接口替换extern "C" __declspec(dllimport) BOOL XL_QueryTaskInfoEx(HANDLE hTask, DownTaskInfo & stTaskInfo);extern "C" __declspec(dllimport) BOOL XL_DelTempFile(DownTaskParam &stParam);extern "C" __declspec(dllimport) void XL_SetSpeedLimit(INT32 nKBps);extern "C" __declspec(dllimport) void XL_SetUploadSpeedLimit(INT32 nTcpKBps,INT32 nOtherKBps);extern "C" __declspec(dllimport) BOOL XL_SetProxy(DOWN_PROXY_INFO &stProxyInfo);extern "C" __declspec(dllimport) void XL_SetUserAgent(const wchar_t *pszUserAgent);extern "C" __declspec(dllimport) BOOL XL_ParseThunderPrivateUrl(const wchar_t *pszThunderUrl, wchar_t *normalUrlBuffer, INT32 bufferLen);extern "C" __declspec(dllimport) BOOL XL_GetFileSizeWithUrl(const wchar_t * lpURL, INT64& iFileSize);extern "C" __declspec(dllimport) BOOL XL_SetFileIdAndSize(HANDLE hTask, char szFileId[40], unsigned __int64 nFileSize);extern "C" __declspec(dllimport) BOOL XL_SetAdditionInfo( HANDLE task_id, WSAPROTOCOL_INFOW *sock_info, CHAR *http_resp_buf, LONG buf_len );extern "C" __declspec(dllimport) HANDLE XL_CreateTaskByURL(const wchar_t *url, const wchar_t *path, const wchar_t *fileName, BOOL IsResume);extern "C" __declspec(dllimport) LONG XL_CreateTaskByThunder(wchar_t *pszUrl, wchar_t *pszFileName, wchar_t *pszReferUrl, wchar_t *pszCharSet, wchar_t *pszCookie);extern "C" __declspec(dllimport) LONG XL_CreateBTTaskByThunder(const wchar_t *pszPath);
};
相关函数的具体说明,可以参考Github上的文档
这一版本没有调用的示例,但是没关系,liebao_Thunder_Cloud这一版本有调用示例;

参考thunderWrapper.h文件中的thunderWrapper类通过
LoadLibrary和GetProcAddress函数调用,使用MSCV2017编译器
并添加<Windows.h>引用,建议添加:
#include <Windows.h>
#include <stdio.h>
#include <Shlwapi.h>
#pragma comment(lib,"Shlwapi")
- 初始化函数示例:
只需要简单修改init方法,修改xldl.dll的加载路径,其他基本不变;
bool init(PCWSTR pDllPath = L"xldl.dll")
{assert(!m_hModule);WCHAR szModulePath[MAX_PATH] = { 0 };GetModuleFileNameW(NULL, szModulePath, MAX_PATH);PathRemoveFileSpecW(szModulePath); // 拆分路径 新版使用PathCchRemoveFileSpecqDebug()<<"[szModulePath] "<<QString::fromWCharArray(szModulePath);WCHAR szDllpath[MAX_PATH] = { 0 };PathCombineW(szDllpath, szModulePath, L"xldl.dll"); // 连接路径, 新版建议使用 PathCchCombineqDebug()<<"[szDllpath] "<<QString::fromWCharArray(szDllpath);m_hModule = LoadLibraryW(szDllpath);assert(m_hModule);if (m_hModule == NULL){qDebug()<<"can not load xldl.dll -->";throw L"can not load xldl.dll";}_Init = (fn_Init) GetProcAddress(m_hModule, "XL_Init");_UnInit = (fn_UnInit) GetProcAddress(m_hModule, "XL_UnInit");_TaskCreate = (fn_TaskCreate) GetProcAddress(m_hModule, "XL_CreateTask");_TaskDelete = (fn_TaskDelete) GetProcAddress(m_hModule, "XL_DeleteTask");_TaskStart = (fn_TaskStart) GetProcAddress(m_hModule, "XL_StartTask");_TaskPause = (fn_StopTask) GetProcAddress(m_hModule, "XL_StopTask");_TaskForcePause = (fn_StopTask) GetProcAddress(m_hModule, "XL_ForceStopTask");_TaskQuery = (fn_TaskQuery) GetProcAddress(m_hModule, "XL_QueryTaskInfo");_TaskQueryEx = (fn_TaskQueryEx) GetProcAddress(m_hModule, "XL_QueryTaskInfoEx");_LimitSpeed = (fn_LimitSpeed) GetProcAddress(m_hModule, "XL_SetSpeedLimit");_LimitUploadSpeed = (fn_LimitUploadSpeed) GetProcAddress(m_hModule, "XL_SetUploadSpeedLimit");_DelTempFile = (fn_DelTempFile) GetProcAddress(m_hModule, "XL_DelTempFile");_SetProxy = (fn_SetProxy) GetProcAddress(m_hModule, "XL_SetProxy");_SetUserAgent = (fn_SetUserAgent) GetProcAddress(m_hModule, "XL_SetUserAgent");_GetFileSizeWithUrl = (fn_GetFileSizeWithUrl) GetProcAddress(m_hModule, "XL_GetFileSizeWithUrl");_ParseThunderPrivateUrl = (fn_ParseThunderPrivateUrl) GetProcAddress(m_hModule, "XL_ParseThunderPrivateUrl");_SetAdditionInfo = (fn_SetAdditionInfo) GetProcAddress(m_hModule, "XL_SetAdditionInfo");_SetFileIdAndSize = (fn_SetFileIdAndSize) GetProcAddress(m_hModule, "XL_SetFileIdAndSize");_CreateTaskByURL = (fn_CreateTaskByURL) GetProcAddress(m_hModule, "XL_CreateTaskByURL");_CreateTaskByThunder = (fn_CreateTaskByThunder) GetProcAddress(m_hModule, "XL_CreateTaskByThunder");_CreateBTTaskByThunder = (fn_CreateBTTaskByThunder) GetProcAddress(m_hModule, "XL_CreateBTTaskByThunder");CHECKFUNC(_Init, false);return _Init() == TRUE;
}
需要注意的是在不同版本中,所包含的方法函数也不一样,例如liebao_Thunder_Cloud 版就没有XL_CreateTaskByURL函数方法,
- 实际线程调用:
继承QThread类,重写void run() override;方法,获取文件总大小,下载进度,下载有效字节数,即时速度,倒计时等信息,并通过信号槽控制下载的中断和退出。
void QThread_ThunderWrapper::run()
{emit IsStart(true);bool ISuccessed=false;IsQuit=false;QString Error="";try {qDebug()<<"QThread_ThunderWrapper Start!";thunderWrapper=new Lib_ThunderWrapper();bool ISuccessed=thunderWrapper->init();if(!ISuccessed)throw QString("Lib_ThunderWrapper 初始化失败!");elseqDebug()<<"thunderWrapper->init : Successed!";wchar_t * url=utf8_to_wchar(Urlpath.toStdString().c_str());wchar_t * path=utf8_to_wchar(Filepath.toStdString().c_str());wchar_t * fileName=utf8_to_wchar(Filename.toStdString().c_str());if(!thunderWrapper->CreateTaskByURL(url,path,fileName,TRUE)){thunderWrapper->unInit();throw QString("taskCreate 失败!");}elseqDebug()<<"thunderWrapper->taskCreate : Successed!";if(!thunderWrapper->taskStart()){thunderWrapper->taskDelete();thunderWrapper->unInit();throw QString("taskStart 失败!");}elseqDebug()<<"thunderWrapper->taskStart : Successed!";//! 1秒查询一次msleep(1000);DownTaskInfo stTaskInfo;while (!IsQuit) {if(thunderWrapper->taskQueryEx(stTaskInfo)){if(stTaskInfo.stat==TSC_ERROR){emit Current_status("下载失败!",TSC_ERROR);throw QString("TSC_ERROR: fail_code:%1").arg(stTaskInfo.fail_code);}else if(stTaskInfo.stat==TSC_PAUSE){emit Current_status("下载暂停!",TSC_PAUSE);}else if(stTaskInfo.stat==TSC_DOWNLOAD){emit Current_status("正在下载...",TSC_PAUSE);emit Down_Speed(stTaskInfo.nSpeed);emit ProgressBar((int)stTaskInfo.fPercent*100);emit SendDownsize(stTaskInfo.nTotalDownload,stTaskInfo.nTotalSize);if(stTaskInfo.nSpeed>0)emit Time_Remaining((stTaskInfo.nTotalSize-stTaskInfo.nTotalDownload)/stTaskInfo.nSpeed);}else if(stTaskInfo.stat==TSC_COMPLETE){ISuccessed=true;IsQuit=true;emit Current_status("下载完成",TSC_COMPLETE);emit Down_Speed(stTaskInfo.nSpeed);emit ProgressBar((int)stTaskInfo.fPercent*100);emit SendDownsize(stTaskInfo.nTotalDownload,stTaskInfo.nTotalSize);emit Time_Remaining(0);break;}else if(stTaskInfo.stat==TSC_STARTPENDING){emit Current_status("等待下载!",TSC_STARTPENDING);}else if(stTaskInfo.stat==TSC_STOPPENDING){emit Current_status("停止等待!",TSC_STARTPENDING);}
// qDebug().noquote()<<QString("\n state : %1 "
// "\n fail_code : %2"
// "\n nTotalSize : %3"
// "\n nTotalDownload : %4"
// "\n fPercent : %5"
// "\n nSrcTotal : %6"
// "\n nSrcUsing : %7"
// "\n nSpeed : %8"
// "\n szFilename : %9"
// "\n szSavePath : %10"
// "\n IsCreatingFile : %11"
// "\n bIsOriginUsable : %12 \n\n")
// .arg(stateStr)
// .arg(stTaskInfo.fail_code)
// .arg(QString::number(stTaskInfo.nTotalSize,10))
// .arg(QString::number(stTaskInfo.nTotalDownload,10))
// .arg(QString::number(stTaskInfo.fPercent))
// .arg(stTaskInfo.nSrcTotal)
// .arg(stTaskInfo.nSrcUsing)
// .arg(stTaskInfo.nSpeed)
// .arg(QString::fromWCharArray(stTaskInfo.szFilename))
// .arg(QString::fromWCharArray(stTaskInfo.szReserved0))
// .arg(stTaskInfo.IsCreatingFile?"TRUE":"FALSE")
// .arg(stTaskInfo.bIsOriginUsable?"TRUE":"FALSE")
// ;//! 1秒查询一次}msleep(1000);}}catch (QString error) {ISuccessed=false;Error="异常信息 :"+error;}catch (...) {}qDebug()<<"thunderWrapper unInit-->";thunderWrapper->unInit();//! 清除连接delete thunderWrapper;thunderWrapper=nullptr;emit IsStart(true);
}
如图所示:
下载在网上找到系统镜像文件时,ThunderOpenSDK下载速度更快, 能稳定到9mb/s左右,而通过原生的QNetworkReply下载最高在5Mb/s左右。

ThunderOpenSDK 下载问题
ThunderOpenSDK 无法下载包含重定向跳转的下载链接,
正当我打算整体改用ThunderOpenSDK下载时,我突然发现ThunderOpenSDK 无法下载项目中的资源文件,换成其他网上找的资源文件又能正常下载,
测试多次发现ThunderOpenSDK只能下载直接指向下载资源的链接,
包含重定向跳转的下载链接下载不了!
无解,果断放弃,还是改用调用Aria2下载!
不过一般的下载ThunderOpenSDK库也完全够用了。
相关文章:
Qt/C++ 调用迅雷开放下载引擎(ThunderOpenSDK)下载数据资源
目录导读 前言ThunderOpenSDK 简介参考 xiaomi_Thunder_Cloud 示例ThunderOpenSDK 下载问题 前言 在对以前老版本的exe执行程序进行研究学习的时候,发现以前的软件是使用的ThunderOpenSDK这个迅雷开放下载引擎进行的项目数据下载,于是在网上搜索一番找到…...
深入详解 Java - Spring MVC
在 Java 企业级开发领域,Spring MVC 是一个极为重要的框架,它为构建强大、灵活且高效的 Web 应用程序提供了坚实的基础。本文将深入详解 Java 之 Spring MVC,带你领略其强大之处。 一、Spring MVC 概述 Spring MVC 是 Spring 框架的一个重要模块,全称为 Spring Web Model-V…...
Spring Boot技术中小企业设备管理系统设计与实践
6系统测试 6.1概念和意义 测试的定义:程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为: 目的:发现程序的错误; 任务:通过在计算机上执行程序,暴露程序中潜在的错误。 另一个…...
动态渲染组件
引言 在现代前端开发中,动态渲染组件是一种常见的需求,特别是在构建复杂的应用程序时。动态渲染组件允许我们在运行时根据不同的条件或数据来决定渲染哪个组件,从而提高代码的灵活性和可维护性。本文将详细介绍如何在 Vue.js 中实现动态渲染…...
一个神秘的新图像生成模型red_panda出现 轻松击败Midjourney与OpenAI
一个神秘的新图像生成模型在众包人工分析基准测试中击败了 Midjourney、黑森林实验室和 OpenAI 的模型。这个名为"red_panda"的模型在人工分析的文本到图像排行榜上领先排名第二的黑森林实验室的 Flux1.1 Pro 约 40 个 Elo 分数。 Artificial Analysis 使用 Elo&…...
云计算平台上的DevOps实践
文章目录 什么是DevOps云计算平台上的DevOps优势自动化部署弹性伸缩地理分布 实施DevOps的关键组件版本控制系统持续集成/持续交付工具配置管理工具监控和日志管理 实践案例使用AWS CodePipeline进行持续集成/持续交付利用AWS Auto Scaling实现弹性使用AWS CloudFormation进行基…...
JS新功能之:全新 Set 方法
JavaScript 的内置Set类将新增一些方法,以便执行集合论中常见的操作,包括: Set.prototype.intersection(other):返回两个集合的交集。 Set.prototype.union(other):返回两个集合的并集。 Set.prototype.difference(o…...
Flume的安装配置
一、上传解压 tar -zxvf apache-flume-1.9.0-bin.tar.gz -C /usr/local/soft/#***在环境变量中增加如下命令,可以使用 soft 快速切换到 /usr/local/soft***alias softcd /usr/local/soft/ 二、配置环境变量 soft #重命名 mv apache-flume-1.9.0-bin/ flume-1.9.0…...
3.1.3 虚存页面的映射
3.1.3 虚存页面的映射 文章目录 3.1.3 虚存页面的映射3.1.3 虚存页面的映射MmCreateVirtualMapping()MmCreateVirtualMappingUnsafe()MiFlushTlb()MmDeleteVirtualMapping()MmPageOu…...
【SSM详细教程】-14-SpringAop超详细讲解
精品专题: 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12789841.html?spm1001.20…...
虚拟机桥接模式连不上,无法进行SSH等远程操作
说明:以下情况在window10上遇到,解决后顺便做了个笔记,以防后续再次用到,也给同道中人提供一个解决方案 一、首先按照以下步骤进行检查 1、是否连接了对应的wifi 2、是否设置了桥接模式 3、上述1、2确认无误的情况下请查看右上…...
jmeter基础01-1_环境准备-windows系统安装jdk
课程大纲 一、步骤解说 step1. jdk官网下载 Java Downloads | Oracle step2. 安装/解压(二选一) 1. 安装包格式(后缀.exe/.msi/.dmg):双击跟随界面向导安装,可以指定安装位置等。 2. 压缩包格式(后缀.z…...
第六天: C语言核心概念与实战技巧全解析
1 主函数(main) 大家好,今天我们来深入探讨一下C语言中非常特殊的一个函数——main函数。虽然大家对它并不陌生,但是它的重要性和特殊性值得我们再次回顾。 main函数的定义 main函数是我们整个C源程序的入口点。计算机在运行程…...
初始JavaEE篇——多线程(5):生产者-消费者模型、阻塞队列
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏:JavaEE 文章目录 阻塞队列生产者—消费者模型生产者—消费者模型的优势:生产者—消费者模型的劣势: Java标准库中的阻…...
2024年下教师资格证面试报名详细流程❗
⏰ 重要时间节点: (一)下半年笔试成绩查询:11月8日10:00 (二)注册报名:11月8日10:00-11日18:00 (三)网上审核:11月8日10:00-11日18:00 (四&#x…...
软考:常用协议和端口号
常用协议及其对应的端口号如下: TCP/IP协议: TCP(传输控制协议):端口号为6UDP(用户数据报协议):端口号为17 网络应用协议: HTTP(超文本传输协议)…...
Linux更改符号链接
目录 1. 删除旧链接 2. 创建新的符号链接 例如我的电脑上有两个版本的cuda,11.8和12.4 1. 删除旧链接 rm cuda 2. 创建新的符号链接 ln -s /usr/local/cuda-11.8/ /usr/local/cuda...
int main(int argc,char* argv[])详解
#include <stdio.h> //argc 是指命令行输入参数的个数; //argv[]存储了所有的命令行参数, //arg[0]通常指向程序中的可执行文件的文件名。在有些版本的编译器中还包括程序文件所在的路径。 //如:"d:\Production\Software\VC_2005_Test\Win32控制台应用程序\Vc_T…...
单片机原理及应用笔记:C51流程控制语句与项目实践
作者介绍 周瑞康,男,银川科技学院,计算机人工智能学院,2022级计算机科学与技术8班本科生,单片机原理及应用课程第八组。 指导老师:王兴泽 电子邮箱2082545622qq.com 前言: 本篇文章是参考《…...
大数据日志处理框架ELK方案
介绍应用场景大数据ELK日志框架安装部署 一,介绍 大数据日志处理框架ELK(Elasticsearch、Logstash、Kibana)是一套完整的日志集中处理方案,以下是对其的详细介绍: 一、Elasticsearch(ES) 基本…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
