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

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访问运行结果: 

 

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RNN和LSTM学习笔记-初学者

提示&#xff1a; 目录 前言一、RNN介绍二、LSTM介绍总结 前言 提示&#xff1a; 提示&#xff1a; 一、RNN介绍 RNN是一种短时记忆&#xff0c;而LSTM是长短时记忆网络 二、LSTM介绍 总结

用python+opencv+PySimpleGUI实现了一款视频播放器

目录 前言准备工作主要思路主界面视频读取进度条拖拽 源码 前言 本篇将用python实现一个mp4播放器&#xff0c;可以通过windows资源管理器选择需要播放的mp4视频文件或者图片&#xff0c;然后提供播放条的快进回放&#xff0c;播放和暂停功能&#xff1a; 准备工作 python所…

5G工业网关视频传输应用

随着科技的不断进步&#xff0c;5G网络技术已经成为了当前最热门的话题之一。而其中一个引人注目的领域就是5G视频传输和5G工业网关应用。在传统网络通信中&#xff0c;由于带宽和延迟的限制&#xff0c;视频传输常常受到限制&#xff0c;而工业网关应用也存在着链路不稳定、数…

http正向代理测试,nginx反向代理中转正向代理服务器

有3台服务器如下&#xff1a; 192.168.111.201&#xff08;反向代理到正向代理服务器&#xff09; 192.168.111.202&#xff08;正向代理服务器&#xff09; 192.168.111.203&#xff08;目标WEB系统&#xff09; 防火墙网络策略如图所示: 1、192.168.111.200 只能访问 192.168…

主宰无双H5:WIN学习手工服务端通用视频教程及GM授权物品后台,支持三网H5玩法介绍

标题&#xff1a;主宰无双H5&#xff08;游戏源码&#xff09;&#xff1a;WIN学习手工服务端通用视频教程及GM授权物品后台&#xff0c;支持三网H5玩法的百科 一、引言 随着互联网的快速发展&#xff0c;H5游戏逐渐成为人们休闲娱乐的重要方式。主宰无双H5游戏源码作为一款深…

深入理解LightGBM

1. LightGBM简介 GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型&#xff0c;其主要思想是利用弱分类器&#xff08;决策树&#xff09;迭代训练以得到最优模型&#xff0c;该模型具有训练效果好、不易过拟合等优点。GBDT不仅在工业界应用广泛&#…

初识Redis缓存,一文掌握Redis重要知识文集。

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

QWebEngineView 透明色 设置白屏闪烁的问题 已解决

在项目开发中。由于qt5.15 升级到qt6.5 不知道因为什么&#xff0c;QWebEngineView 加载出现白屏&#xff0c; 网上大神给的方案 五花八门&#xff0c;没有一个解决问题。 代码 旧代码QWebEngineView* pWebEngineView new QWebEngineView();//pWebEngineView->page()->…

HTML+CSS高频面试题

面试题目录 前言1.讲一下盒模型&#xff0c;普通盒模型和怪异盒模型有什么区别2.CSS如何实现居中3.讲一下flex弹性盒布局4.CSS常见的选择器有哪些&#xff1f;优先级5.长度单位px 、em、rem的区别6.position属性的值有哪些7.display属性的值有哪些&#xff0c;分别有什么作用8.…

ChatGPT在指尖跳舞: open-interpreter实现本地数据采集、处理一条龙

原文&#xff1a;ChatGPT在指尖跳舞: open-interpreter实现本地数据采集、处理一条龙 - 知乎 目录 收起 Part1 前言 Part2 Open - Interpreter 简介 Part3 安装与运行 Part4 工作场景 1获取网页内容 2 pdf 文件批量转换 3 excel 文件合并 Part5总结 参考资料 往期推…

字符设备驱动模块的编译

一. 简介 本文继上一篇文章的学习&#xff0c;上一篇文章学习了字符设备驱动框架的初步编写。文章地址如下&#xff1a; 字符设备驱动框架的编写-CSDN博客 本文对上一篇编写的驱动模块初步框架进行编译。 二. 字符设备驱动模块的编译 上一篇文章&#xff0c;编写了字符设备…

多分类预测 | MATLAB实现CNN-LSTM-Attention多输入分类预测

分类预测 | MATLAB实现CNN-LSTM-Attention多输入分类预测 分类效果 需要源码和数据的私信&#xff08;微微有偿取哦&#xff09;

swing快速入门(十二)

注释很详细&#xff0c;直接上代码 上一篇 新增内容 1.Box容器和BroadLayout布局管理器的结合用法 2.textArea&#xff08;多行文本域&#xff09; 3.Choice&#xff08;下拉选择栏&#xff09; 4. CheckboxGroup&#xff08;多项单选选择框&#xff09; 5. Checkbox&…

爬虫chrome浏览器抓包说明

chrome浏览器抓包说明 目标&#xff1a;掌握chrome在爬虫中的使用 1. 新建隐身窗口&#xff08;无痕窗口&#xff09; 作用&#xff1a;在打开无痕窗口的时候&#xff0c;第一次请求某个网站是没有携带cookie的&#xff0c;和代码请求一个网站一样&#xff0c;这样就能够尽可…

网络服务IP属地发生变化的原因有哪些?

近期&#xff0c;许多用户发现自己的网络服务IP属地发生了变化。原本固定的IP地址不再是静态的&#xff0c;而是发生了变动。这一现象引起了广大用户的关注和疑惑&#xff0c;对网络服务的使用和信息安全产生了影响。为了解决用户的疑虑&#xff0c;我们对此现象进行了深入探究…

.NET 8的正式发布,对Telerik开发工具意味着什么?

微软日前正式发布了.NET 8稳定版&#xff0c;这是一个长期支持(LTS)的版本&#xff0c;它可以使Android、Windows和macOS跨平台应用的开发过程高效流畅&#xff0c;同样的目标也驱使着Telerik UI不断进步和发展&#xff01; Telerik DevCraft包含一个完整的产品栈来构建您下一个…

现代雷达车载应用——第2章 汽车雷达系统原理 2.6节 雷达设计考虑

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.6 雷达设计考虑 上述部分给出了汽车雷达基本原理的简要概述。在雷达系统的设计中&#xff0c;有几个方面是必不可少的&#xff0c;它们决定了雷达系…

真正可行的vue3迁移到nuxt3方法(本人亲测,完全避坑)

终于到了总结经验的时候了&#xff0c;这绝对是全网唯一、完全真正可行的干货。 在我看来&#xff0c;知识就是要拿来分享的&#xff0c;分享给他人也是在提高自己。我绝对不会搞什么订阅或者vip专栏来搞钱坑害各位&#xff0c; 因为我在csdn写文章最主要的目的是为了记录和总…

接口测试 — 4.Requests库GET、Post请求

Requests库GET请求是使用HTTP协议中的GET请求方式对目标网站发起请求。 &#xff08;不带参数的GET请求请看上一篇文章的练习&#xff09; 1、Requests库待参数的GET请求 使用Get方法带参数请求时&#xff0c;是params参数字典&#xff0c;而不是data参数字典。data参数字典…

从零开始:前端架构师的基础建设和架构设计之路

文章目录 一、引言二、前端架构师的职责三、基础建设四、架构设计思想五、总结《前端架构师&#xff1a;基础建设与架构设计思想》编辑推荐内容简介作者简介目录获取方式 一、引言 在现代软件开发中&#xff0c;前端开发已经成为了一个不可或缺的部分。随着互联网的普及和移动…