动态库实现lua网络请求GET, POST, 下载文件

DLL需要使用的网络封装

WinHttp异步实现GET, POST, 多线程下载文件_webclient post下载文件-CSDN博客文章浏览阅读726次。基于WinHttp封装, 实现异步多线程文件下载, GET请求, POST请求_webclient post下载文件https://blog.csdn.net/Flame_Cyclone/article/details/142644088

lua_network.h

#pragma once#include "../common/include/lua.hpp"
#include "lua_utils.h"
#include "Win32Utils/fcjson.h"class lua_network
{
public:static void register_functions(lua_State* L, const char* lib_name);static int get(lua_State* L);static int post(lua_State* L);static int download(lua_State* L);
};

lua_network.cpp

#include "lua_network.h"
#include "lua_utils.h"
#include "Win32Utils/CStrUtils.h"
#include "Win32Utils/CWinHttpClient.h"static luaL_Reg lib_functions[] =
{{"get", lua_network::get},{"post", lua_network::post},{"download", lua_network::download},{ NULL, NULL}
};void lua_network::register_functions(lua_State* L, const char* lib_name)
{lua_newtable(L);luaL_Reg* fun_info = lib_functions;while (fun_info->func){lua_pushcfunction(L, fun_info->func);lua_setfield(L, -2, fun_info->name);fun_info++;}lua_setfield(L, -2, lib_name);
}int lua_network::get(lua_State* L)
{int nTop = lua_gettop(L);_tstring strUrl;std::string strParam;_tstring strHeader;bool fCallback = false;int ref = 0;if (lua_isfunction(L, -1)){fCallback = true;ref = luaL_ref(L, LUA_REGISTRYINDEX);}if (nTop >= 1 && lua_isstring(L, 1)){strUrl = CStrUtils::AStrToTStr(lua_tostring(L, 1));}if (nTop >= 2){if (lua_isstring(L, 2)){strParam = lua_tostring(L, 2);}else if (lua_istable(L, 2)){lua_utils::dump_value(L, strParam, 2, dump_type::dump_get);}}if (nTop >= 3){if (lua_isstring(L, 3)){strHeader = lua_tostring(L, 3);}else if (lua_istable(L, 3)){lua_utils::dump_value(L, strHeader, 3, dump_type::dump_header);}}CWinHttpClient obj;CWinHttpResult res = obj.Get(strUrl, strParam, strHeader, [&L, ref, fCallback](const WINHTTP_PROGRESS_INFO& progress) -> bool {if (fCallback){lua_rawgeti(L, LUA_REGISTRYINDEX, ref);lua_newtable(L);lua_utils::set_key_value(L, "Progress", progress.lfProgress);lua_utils::set_key_value(L, "RemainTime", progress.lfRemainTime);lua_utils::set_key_value(L, "Speed", progress.lfSpeed);lua_utils::set_key_value(L, "Cur", (double)progress.ullCur);lua_utils::set_key_value(L, "Total", (double)progress.ullTotal);lua_pcall(L, 1, 0, 0);}return true;});if (fCallback){luaL_unref(L, LUA_REGISTRYINDEX, ref);}lua_newtable(L);lua_utils::set_key_value(L, "code", (lua_Integer)res.code);lua_utils::set_key_value(L, "result", CStrUtils::U8StrToAStr(res.result).c_str());return 1;
}int lua_network::post(lua_State* L)
{int nTop = lua_gettop(L);_tstring strUrl;std::string strParam;_tstring strHeader;bool fCallback = false;int ref = 0;if (lua_isfunction(L, -1)){fCallback = true;ref = luaL_ref(L, LUA_REGISTRYINDEX);}if (nTop >= 1 && lua_isstring(L, 1)){strUrl = CStrUtils::AStrToTStr(lua_tostring(L, 1));}if (nTop >= 2){if (lua_isstring(L, 2)){strParam = lua_tostring(L, 2);}else if (lua_istable(L, 2)){lua_utils::dump_value(L, strParam, 2, dump_type::dump_json);}}if (nTop >= 3){if (lua_isstring(L, 3)){strHeader = lua_tostring(L, 3);}else if (lua_istable(L, 3)){lua_utils::dump_value(L, strHeader, 3, dump_type::dump_header);}}CWinHttpClient obj;CWinHttpResult res = obj.Post(strUrl, strParam, strHeader, [&L, ref, fCallback](const WINHTTP_PROGRESS_INFO& progress) -> bool {if (fCallback){lua_rawgeti(L, LUA_REGISTRYINDEX, ref);lua_newtable(L);lua_utils::set_key_value(L, "Progress", progress.lfProgress);lua_utils::set_key_value(L, "RemainTime", progress.lfRemainTime);lua_utils::set_key_value(L, "Speed", progress.lfSpeed);lua_utils::set_key_value(L, "Cur", (double)progress.ullCur);lua_utils::set_key_value(L, "Total", (double)progress.ullTotal);lua_pcall(L, 1, 0, 0);}return true;});if (fCallback){luaL_unref(L, LUA_REGISTRYINDEX, ref);}lua_newtable(L);lua_utils::set_key_value(L, "code", (lua_Integer)res.code);lua_utils::set_key_value(L, "result", CStrUtils::U8StrToAStr(res.result).c_str());return 1;
}int lua_network::download(lua_State* L)
{int nTop = lua_gettop(L);_tstring strUrl;_tstring strHeader;_tstring strPath;bool fCallback = false;int ref = 0;if (lua_isfunction(L, -1)){fCallback = true;ref = luaL_ref(L, LUA_REGISTRYINDEX);}if (nTop >= 1 && lua_isstring(L, 1)){strUrl = CStrUtils::AStrToTStr(lua_tostring(L, 1));}if (nTop >= 2 && lua_isstring(L, 2)){strPath = CStrUtils::AStrToTStr(lua_tostring(L, 2));}if (nTop >= 3){if (lua_isstring(L, 3)){strHeader = lua_tostring(L, 3);}else if (lua_istable(L, 3)){lua_utils::dump_value(L, strHeader, 3, dump_type::dump_header);}}CWinHttpClient obj;CWinHttpResult res = obj.DownloadFile(strUrl, strPath, strHeader, [&L, ref, fCallback](const WINHTTP_PROGRESS_INFO& progress) -> bool {if (fCallback){lua_rawgeti(L, LUA_REGISTRYINDEX, ref);lua_newtable(L);lua_utils::set_key_value(L, "Progress", progress.lfProgress);lua_utils::set_key_value(L, "RemainTime", progress.lfRemainTime);lua_utils::set_key_value(L, "Speed", progress.lfSpeed);lua_utils::set_key_value(L, "Cur", (double)progress.ullCur);lua_utils::set_key_value(L, "Total", (double)progress.ullTotal);lua_pcall(L, 1, 0, 0);}return true;}, std::thread::hardware_concurrency());if (fCallback){luaL_unref(L, LUA_REGISTRYINDEX, ref);}lua_newtable(L);lua_utils::set_key_value(L, "code", (lua_Integer)res.code);lua_utils::set_key_value(L, "result", CStrUtils::U8StrToAStr(res.result).c_str());return 1;
}

lua_demo.lua

json = require("JSON")
fclib = require("FCLIB")
lib = nil
--判断当前运行位数
function is64bit()arc = os.getenv("PROCESSOR_ARCHITECTURE")if arc == "x86" thenreturn falseendreturn true
end--加载动态库
if is64bit() thenlib = require("lua_library_x64")
elselib = require("lua_library_x86")
endlib.debug.print(lib)-- 获取弹幕信息
function get_last_msg()--请求链接url = 'https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory?roomid=4412054'-- 参数local param = {}--请求头local header = {['User-Agent']='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0'}res = lib.network.get(url, param, header)lib.debug.print(res)json_val = lib.json.decode(res.result)cur_msg = nilif json_val thenfor k, v in pairs(json_val['data']['room']) doif 0 ~= k thencur_msg = vendendendreturn cur_msg
endlib.debug.print(get_last_msg())function download(info)unit = 1024 * 1024fmt = '%.2f%% %.3gMB/%.3gMB %.3gMB/s'info = string.format(fmt, info['Progress'] * 100, info['Cur'] / unit, info['Total'] / unit, info['Speed'] / unit)print(info)
end--下载链接
download_url = "https://drivers.amd.com/drivers/whql-amd-software-adrenalin-edition-24.8.1-win10-win11-aug-rdna.exe"file_path = 'whql-amd-software-adrenalin-edition-24.8.1-win10-win11-aug-rdna.exe'--请求头
header = {['User-Agent']='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0',['Referer']= 'https://www.amd.com/'
}--下载文件
fResult = lib.network.download(download_url, file_path, header, download)

效果

lua_demo_x64.exe lua_demo.lua

 仓库

https://gitee.com/flame_cyclone/lua_example

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/462744.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客周赛65(C++实现)

比赛链接:牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 文章目录 1.超市1.1 题目描述1.2 思路1.3 代码 2. 雨幕2.1 题目描述2.2 思路2.3 代码 3.闺蜜3.1 题目描述3.2 思路3.3 代码 4. 医生4.1 题目描述4.2 思路4.3 代码 1.超市 1.1 题目描述 …

机器人技术革新:人工智能的强力驱动

内容概要 在当今世界,机器人技术与人工智能的结合正如星星与大海,彼此辉映。随着科技的不断进步,人工智能不仅仅是为机器人赋予了“聪明的大脑”,更是推动了整个行业的快速发展。回顾机器人技术的发展历程,我们会发现…

使用PostgreSQL进行高效数据管理

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 使用PostgreSQL进行高效数据管理 PostgreSQL简介 安装PostgreSQL 在Ubuntu上安装PostgreSQL 在CentOS上安装PostgreSQL 在macOS上…

为开源 AI 模型引入激励机制?解读加密 AI 协议 Sentient 的大模型代币化解决方案

撰文:Shlok Khemani 编译:Glendon,Techub News 古时候,中国人深信「阴阳」的概念——宇宙的每一个方面都蕴含着内在的二元性,这两种相反的力量不断地相互联系,形成一个统一的整体。就好比女性代表「阴」&a…

Hi3516/Hi3519DV500移植YOLOV5、YOLOV6、YOLOV7、YOLOV8开发环境搭建--YOLOV5工程编译移植到开发板测试--(5)

专栏链接如下: Hi3516/Hi3519DV500移植YOLOV5、YOLOV6、YOLOV7、YOLOV8开发环境搭建--安装Ubuntu18.04--(1) Hi3516/Hi3519DV500移植YOLOV5、YOLOV6、YOLOV7、YOLOV8开发环境搭建--安装开发环境AMCT、依赖包等--(2)…

【STM32】INA3221三通道电压电流采集模块,HAL库

一、简单介绍 芯片的datasheet地址: INA3221 三通道、高侧测量、分流和总线电压监视器,具有兼容 I2C 和 SMBUS 的接口 datasheet (Rev. B) 笔者所使用的INA3221是淘宝买的模块 原理图 模块的三个通道的电压都是一样,都是POWER。这个芯片采用…

HTML 标签属性——id、class、style 等全局属性详解

文章目录 1. id属性2. class属性3. style属性4. title属性5. lang属性6. dir属性7. accesskey属性8. tabindex属性小结HTML全局属性是一组可以应用于几乎所有HTML元素的特殊属性。这些属性提供了额外的功能和信息,使得网页开发者能够更好地控制元素的行为、样式和可访问性。 …

Python数据分析案例62——基于MAGU-LSTM的时间序列预测(记忆增强门控单元)

案例背景 时间序列lstm系列预测在学术界发论文都被做烂了,现在有一个新的MAGU-LSTM层的代码,并且效果还可以,非常少见我觉得还比较创新,然后我就分享一下它的代码演示一下,并且结合模态分解等方法做一次全面的深度学习…

C++泛型编程

一、什么是泛型编程 泛型编程 是一种编程范式,它通过编写可以处理多种数据类型的代码来实现代码的灵活复用。泛型编程主要通过模板来实现。 比如我们日常使用的容器类型vector就应用了模板来实现其通用性,我们在使用时可以通过传入型别创建对应的动态数…

ServletContext,Cookie,HttpSession的使用

ServletContext对象 ServletContext对象官方也称servlet上下文。服务器会为每一个Web应用创建一个ServletContext对象,这个对象全局唯一,而且Web应用中所有的Servlet都共享这个对象。 ServletContext对象的作用 相对路径转绝对路径 servletContext.g…

如何封装一个可取消的 HTTP 请求?

前言 你可能会好奇什么样的场景会需要取消 HTTP 请求呢? 确实在实际的项目开发中,可能会很少有这样的需求,但是不代表没有,比如: 假如要实现上述这个公告栏,每点击一个 tab 按钮就会切换展示容器容器中…

前端笔试新问题总结

记录总结下最近遇到的前端笔试新问题 目录 一、操作数组方法 1.Array.isArray(arr) 2.Object.prototype.toString.call(arr) "[object Array]" 3.arr instanceof Array 1)跨帧问题 2)修改Array.prototype 3)模拟数组的对象…

玩转Hugging Face/魔搭社区/魔乐社区”教程

2.1 HF 平台 2.1.1 注册Hugging Face 平台 (需要魔法上网) Hugging Face 最初专注于开发聊天机器人服务。尽管他们的聊天机器人项目并未取得预期的成功,但他们在GitHub上开源的Transformers库却意外地在机器学习领域引起了巨大轰动。如今&…

Chrome与夸克谁更节省系统资源

在当今数字化时代,浏览器已经成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐,我们都依赖于浏览器来访问互联网。然而,不同的浏览器在性能和资源消耗方面存在差异。本文将探讨Chrome和夸克两款浏览器在系统资源消耗方面的表现…

【OJ题解】C++实现反转字符串中的每个单词

💵个人主页: 起名字真南 💵个人专栏:【数据结构初阶】 【C语言】 【C】 【OJ题解】 题目要求:给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 题目链接: 反转字符串中的所…

Vue 学习随笔系列十三 -- ElementUI 表格合并单元格

ElementUI 表格合并单元格 文章目录 ElementUI 表格合并单元格[TOC](文章目录)一、表头合并二、单元格合并1、示例代码2、示例效果 一、表头合并 参考&#xff1a; https://www.jianshu.com/p/2befeb356a31 二、单元格合并 1、示例代码 <template><div><el-…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)4.3-4.4

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第四周 特殊应用&#xff1a;人脸识别和神经风格转换&#xff08;Special applications: Face recognition &Neural style transfer&#xff09;4.3 Siamese 网络&#xff08;Siamese net…

vue data变量之间相互赋值或进行数据联动

摘要&#xff1a; 使用vue时开发会用到data中是数据是相互驱动&#xff0c;经常会想到watch,computed&#xff0c;总结一下&#xff01; 直接赋值&#xff1a; 在 data 函数中定义的变量可以直接在方法中进行赋值。 export default {data() {return {a: 1,b: 2};},methods: {u…

安装Blender并使用

前言 该系列记录了如何用Blenderpro来构建自己的场景数据集&#xff0c;从环境搭建到后期构建数据集的整个流程 本文章是第一部分&#xff0c;BlenderPrc2的安装以及环境配置 部分参考https://blog.csdn.net/weixin_49521551/article/details/121573334 官方文档https://dlr…

百度SEO分析实用指南 提升网站搜索排名的有效策略

内容概要 在数字化时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为提升网站曝光度的关键工具。本指南将带您了解SEO的基本知识&#xff0c;帮助您在复杂的网络环境中立足。我们将从关键词优化开始&#xff0c;重点讲解如何选择合适的关键词来提高搜索引擎排…