基于C/C++的libcurl多协议文件传输库dll二次封装开发使用

news2024/10/6 6:51:31

libcurl 可能是最便携、最强大和最常用的 这个星球上的网络传输库。官方提供的示例,需要在项目中引用到libcurl-imp.lib才能使用。

这里我改造了下工程,将常用的接口导出到了libcurl.dll中方便直接在后续的工程代码中应用,下面可以看到dll常用的使用接口:

libcurl.dll中接口的导出: libcurl.c

#include<stdio.h>
#include "curl/curl.h"
#include "libcurl.h"
#define UNZ_OK                          (0)
#define Z_ERRNO							(-1)
#define UNZ_ERRNO                       (Z_ERRNO)

typedef  CURLcode(*Curl_global_init)(long);
typedef  struct Curl_easy* (*Curl_easy_init)(void);
//typedef  CURLcode(*Curl_easy_setopt)(CURL*, CURLoption, ...);
typedef  CURLcode(*Curl_easy_perform)(CURL*);
typedef  void (*Curl_easy_cleanup)(CURL*);
typedef  void (*Curl_global_cleanup)(void);

//定义API函数变量
HMODULE curlDll;
int curl_load = UNZ_ERRNO;
static Curl_global_init	_curl_global_init;
static Curl_easy_init _curl_easy_init;
//static Curl_easy_setopt _curl_easy_setopt;
static Curl_easy_perform _curl_easy_perform;
static Curl_easy_cleanup _curl_easy_cleanup;
static Curl_global_cleanup _curl_global_cleanup;

int libcurl_init() {
	char path[] = "D:\\D-Pro\\Summary\\libcurl\\Debug\\libcurl.dll";
	if (curl_load == UNZ_OK)
		return UNZ_OK;
	curlDll = LoadLibrary(path);
	if (curlDll != NULL) {
		_curl_global_init = (Curl_global_init)GetProcAddress(curlDll, "curl_global_init");
		_curl_easy_init = (Curl_easy_init)GetProcAddress(curlDll, "curl_easy_init");
		_curl_easy_setopt = (Curl_easy_setopt)GetProcAddress(curlDll, "curl_easy_setopt");
		_curl_easy_perform = (Curl_easy_perform)GetProcAddress(curlDll, "curl_easy_perform");
		_curl_easy_cleanup = (Curl_easy_cleanup)GetProcAddress(curlDll, "curl_easy_cleanup");
		_curl_global_cleanup = (Curl_global_cleanup)GetProcAddress(curlDll, "curl_global_cleanup");
		curl_load = UNZ_OK;
		return UNZ_OK;
	}
	return UNZ_ERRNO;
}
CURLcode libcurl_global_init(long flags)
{
	if (curl_load == UNZ_OK)
		return _curl_global_init(flags);
}
CURLcode libcurl_easy_perform(CURL* curl) {
	return _curl_easy_perform(curl);
}
void libcurl_easy_cleanup(CURL* curl) {
	_curl_easy_cleanup(curl);
}
void libcurl_global_cleanup(void) {
	_curl_global_cleanup();
}
struct Curl_easy* libcurl_easy_init()
{
	return _curl_easy_init();
}
//CURLcode libcurl_easy_setopt(struct Curl_easy* data, CURLoption tag, ...)
//{
//	va_list arg;
//	CURLcode result;
//
//	if (!data)
//		return CURLE_BAD_FUNCTION_ARGUMENT;
//
//	va_start(arg, tag);
//
//	result = _curl_easy_setopt(data, tag, arg);
//
//	va_end(arg);
//	return result;
//}

相关操作接口的声明:libcurl.h

#pragma once
#include <curl/curl.h>
#ifndef	__LIBCURL_H__
#define __LIBCURL_H__
#ifdef __cplusplus
extern "C" {
#endif
	typedef  CURLcode(*Curl_easy_setopt)(CURL*, CURLoption, ...);
	Curl_easy_setopt _curl_easy_setopt;
	int libcurl_init();
	void libcurl_easy_cleanup(CURL* curl);
	void libcurl_global_cleanup(void);
	struct Curl_easy* libcurl_easy_init();
	CURLcode libcurl_global_init(long flags);
	CURLcode libcurl_easy_perform(CURL* curl);
	//CURLcode libcurl_easy_setopt(struct Curl_easy* data, CURLoption tag, ...);
#define  libcurl_easy_setopt _curl_easy_setopt
#ifdef __cplusplus
}
#endif

#endif	/* __LIBCURL_H__ */

 http访问测试应用示例: test.c

#include <stdio.h>
#include "curl/curl.h"
#include "libcurl.h"
#include "gb2312.h"
unsigned int read_callback(void* ptr, size_t size, size_t nmemb, void* userp)
{
	char* pTmp = (char*)userp;

	unsigned long sizes = size * nmemb;
	if (!ptr)
	{
		return 0;
	}
	strncpy(pTmp, (char*)ptr, sizes);
	return sizes;


}
int Post(char* szUrl, char* szParameter, char* szResult, char* szErrorMessage)
{
	CURL* curl = NULL;
	CURLcode res;
	struct curl_slist* headers = NULL;

	res = libcurl_global_init(CURL_GLOBAL_ALL);
	if (res != CURLE_OK)
	{
		szErrorMessage = "下载过程初始化错误!";
		return 0;
	}
	curl = libcurl_easy_init();
	if (curl)
	{
		libcurl_easy_setopt(curl, CURLOPT_URL, szUrl);
		libcurl_easy_setopt(curl, CURLOPT_POST, 1L);
		libcurl_easy_setopt(curl, CURLOPT_POSTFIELDS, szParameter);
		libcurl_easy_setopt(curl, CURLOPT_ENCODING, "");
		libcurl_easy_setopt(curl, CURLOPT_WRITEDATA, szResult);
		libcurl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, read_callback);
		libcurl_easy_setopt(curl, CURLOPT_TIMEOUT, 4); 
		res = libcurl_easy_perform(curl);
		if (res != CURLE_OK)
		{
			szErrorMessage = "通讯失败, 请检查线路!";
			return 0;
		}
		libcurl_easy_cleanup(curl);
	}
	libcurl_global_cleanup();
	return 1;
}
int main() {
	char result[1000];
	char msg[1000];
	memset(result, 0, 1000);
	libcurl_init();
	Post("http://XXXXXXXXXXXX", "", result, msg);
	printf("\nresult:%s", result);
	return 0;
}

http访问运行结果: 

 

跟网页访问的结果是一样的。 这里我发现有个乱码问题。利用前面提到的转编码问题即可解决。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用广播星历进行 GPS 卫星位置的计算

目录 1.计算卫星运动的平均角速度 n 2.计算观测瞬间卫星的近地点角 3.计算偏近点角 4.计算真近点角 f 5.计算升交角距 6.计算摄动改正项 7.进行摄动改正 8.计算卫星在轨道面坐标系中的位置 9.计算观测瞬间升交点的经度 L 10.计算卫星在瞬时地球坐标系中的位置 11.…

最大子数组和java实现【动态规划基础练习】

12.15 最大子数组和 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4]…

笔记本电脑如何安装爱快软路由

环境&#xff1a; dell3490 笔记本 装机U盘 问题描述&#xff1a; 笔记本电脑如何安装爱快软路由 解决方案&#xff1a; 1.电脑bios关闭 安全启动 2.下载官网镜像 3.UEFI引导 在PE下面 新建esp分区300M 把系统镜像里面全部文件&#xff0c;提取到这个分区 最后&…

数据结构(7.5)-- 树扩展之字典树

一、字典树 1、字典树介绍 字典树&#xff0c;也称为“前缀树”&#xff0c;是一种特殊的树状数据结构&#xff0c;对于解决字符串相关问题非常有效。典型 用于统计、排序、和保存大量字符串。所以经常被搜索引擎系统用于文本词频统计。它的优点是&#xff1a; 利用字符串的…

【Qt问题记录】使用QDebug类输出不带转义或双引号

问题 使用Qt进行编程时&#xff0c;需要借助输出信息验证编码的正确性。 默认情况下&#xff0c;如果输出的是字符串&#xff0c;qDebug() 会在字符串的两侧加上引号&#xff0c;有时还会转义。 如下所示&#xff1a; QString strInfo QStringLiteral("helloworld"…

[原创][R语言]股票分析实战:周级别涨幅趋势的相关性

[简介]常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、De…

网络安全Web学习记录———CTF---Web---SQL注入(GET和POST传参)例题

小白初见&#xff0c;若有问题&#xff0c;希望各位大哥多多指正~ 我的第一道web类CTF题——一起来撸猫o(•ェ•)m-CSDN博客 最开始学习CTF里的web方向时&#xff0c;每次做了题遇到类似的老是忘记之前的解法&#xff0c;所以写点东西记录一下。听大哥的话&#xff0c;就从最…

架构设计系列之常见架构(二)

五、DDD&#xff08;领域驱动设计&#xff09; 领域驱动设计&#xff08;Domain-Driven Design&#xff0c;DDD&#xff09;是一种开发思想&#xff0c;强调将软件系统的注意力集中在业务领域上&#xff0c;将领域视为应用的核心。在架构设计中&#xff0c;DDD 提供了一种不同…

cgal教程 3D Alpha Wrapping

文章目录 3D Alpha Wrapping (3D alpha 包裹)1 介绍2 方法2.1 算法2.2 保证 3 接口4 选择参数4.1 alpha4.2 Offset4.3 关于“双面”包裹的注意事项 5 性能6 例子 3D Alpha Wrapping (3D alpha 包裹) 原文地址: https://doc.cgal.org/latest/Alpha_wrap_3/index.html#Chapter_3D…

Linux unzip解压多个文件

前情介绍 最近下载了imagenet1k数据集&#xff0c;令人难受的是这里边有很多的zip包&#xff0c;我总不能一个一个解压吧&#xff0c;这就太费时了&#xff0c;有点程序员思维很重要&#xff1a;批量解压。 解决办法 假设当前目录下有多个zip文件 需要 unzip *.zip …

【FunASR】Paraformer语音识别-中文-通用-16k-离线-large-onnx

模型亮点 模型文件: damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorchParaformer-large长音频模型集成VAD、ASR、标点与时间戳功能&#xff0c;可直接对时长为数小时音频进行识别&#xff0c;并输出带标点文字与时间戳&#xff1a; ASR模型…

apt-mark工具介绍(标记或取消标记软件包,防止特定软件包被自动更新或删除)

文章目录 apt-mark工具深度解析1. apt-mark概述1.1 apt-mark定义1.2 apt-mark作用 2. apt-mark常用命令2.1 标记软件包为手动安装2.2 标记软件包为自动安装2.3 阻止软件包更新2.4 允许软件包更新 3. 疑难技术点解析3.1 如何查看软件包的标记状态3.2 如何解决软件包依赖性问题 4…

IDEA新建jdk8 spring boot项目

今天新建spring boot项目发现JDK版本最低可选17。 但是目前用的最多的还是JDK8啊。 解决办法 Server URL中设置&#xff1a; https://start.aliyun.com/设置完成后&#xff0c;又可以愉快的用jdk8创建项目了。 参考 https://blog.csdn.net/imbzz/article/details/13469117…

【C++】POCO学习总结(十七):日志系统(级别、通道、格式化、记录流)

【C】郭老二博文之&#xff1a;C目录 1、Poco::Message 日志消息 1.1 说明 所有日志消息都在Poco::Message对象中存储和传输。 头文件&#xff1a;#include “Poco/Message.h” 一条消息包含如下内容&#xff1a;优先级、来源、一个文本、一个时间戳、进程和线程标识符、可选…

每天五分钟计算机视觉:Inception网络是由多个Inception模块构成

本文重点 inception从另一种角度来提升训练结果:能更高效的利用计算资源,在相同的计算量下能提取到更多的特征,从而提升训练结果。可以简单的理解为Inception 网络是由一个一个的Inception模块构建成的,我们来看一下。 Inception模块 如上就是Inception模块的 通过一个1…

【Android逆向】记录一次某某虚拟机的逆向

导语 学了一段时间的XPosed&#xff0c;发现XPosed真的好强&#xff0c;只要技术强&#xff0c;什么操作都能实现... 这次主要记录一下我对这款应用的逆向思路 apk检查 使用MT管理器检查apk的加壳情况 发现是某数字的免费版本 直接使用frida-dexdump 脱下来后备用 应用分…

【MYSQL】事务隔离级别、脏读、不可重复读、幻读

文章目录 介绍演示脏读不可重复读可重复读幻读 不可重复读和幻读的区别 参考 作者 Guide: 事务隔离级别 美团技术团队&#xff1a; Innodb中的事务隔离级别和锁的关系 介绍 SQL 标准定义了四个隔离级别&#xff1a; READ-UNCOMMITTED(读取未提交) &#xff1a;最低的隔离级别…

虚拟机启动 I/O error in “xfs_read_agi+0x95“

1.在选择系统界面按e 进入维护模式 2.找到ro把ro改成 rw init/sysroot/bin/sh 然后按Ctrlx 3.找到坏掉的分区&#xff0c;以nvme0n1p3为例进行修复 xfs_repair -d /dev/nvme0n1p3 4.init 6 重新启动 以下情况 先umount 再修复 则修复成功

SaaS行业分析

文章目录 什么是SaaS ?SaaS的标准定义什么是软件即服务&#xff1f;SaaS与传统软件的区别 &#xff1f; SaaS行业分析你知道最赚钱的行业是什么&#xff1f;互联网带给企业的变化 SaaS与PaaS、IaaS的区别&#xff1f;IaaS&#xff08;Infrastructure as a Service&#xff09;…

消除非受检警告

在Java中&#xff0c;有一些情况下编译器会生成非受检警告&#xff08;Unchecked Warnings&#xff09;。这些警告通常与泛型、类型转换或原始类型相关。消除这些警告可以提高代码的可读性和安全性。以下是一些常见的非受检警告以及如何消除它们的例子&#xff1a; 1. 泛型类型…