基于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" {
#endiftypedef  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.hqwc.cn/news/278311.html

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

相关文章

掌握 RPC 接口测试:一篇详尽的接口测试手册

RPC 是什么&#xff1f; 远程过程调用协议&#xff08;RPC&#xff09;是一种技术&#xff0c;它允许在不同的机器上执行函数&#xff0c;就好像这些函数是本地调用一样。简单地说&#xff0c;客户端系统透明地从网络上的远程服务器软件请求服务&#xff0c;而无需理解复杂的网…

jenkins学习19 - pipline 构建项目生成 allure报告并发送邮箱

前言 个人其实一直的不太喜欢用邮箱发送报告&#xff0c;测试报告用邮件通知这都是五六年前的事情了&#xff0c;但有部分小伙伴依然执着于发邮件报告通知。 这里整理了下发邮箱通知的教程。 配置你的邮箱 配置邮箱这一步最繁琐&#xff0c;由于每个人使用的邮箱不一样&…

Axure动态面板的使用

一. 动态面板 Axure动态面板是Axure RP软件中的一个功能模块&#xff0c;用于创建交互式原型和模拟应用程序的动态效果。它可以模拟用户在应用程序中的操作流程&#xff0c;并展示不同状态之间的变化&#xff0c;提供更真实的用户体验。通过创建不同的状态和添加交互效果&…

一种用于心音分类的轻量级1D-CNN+DWT网络

这是由National Institute of Technology Rourkela, Central University of Rajasthan发布在2022 ICETCI的论文&#xff0c;利用离散小波变换(DWT)得到的多分辨率域特征对1D-CNN模型进行心音分类训练。 预处理& DWT 由于FHS和各种病理声的频率范围在500hz以下[5]&#xff…

【Android】使用 Glide 给 ImageView 加载图像的简单案例

前言 Android Glide是一个用于在Android应用中加载和显示图片的流行开源库。它提供了简单易用的API&#xff0c;可以帮助开发者高效地加载远程图片、本地图片以及GIF动画&#xff0c;并提供了缓存、内存管理等功能&#xff0c;使得图片加载在移动应用中更加流畅和高效。Glide还…

云开发微信小程序实战

随着移动互联网的快速发展&#xff0c;微信小程序作为一种轻量级的应用程序&#xff0c;逐渐成为了企业开展业务和提升用户体验的重要工具。而云开发则为企业提供了高效、安全、可靠的后台服务&#xff0c;使得小程序的开发和维护更加便捷。本文将详细介绍如何使用微信小程序与…

解析多云管理软件:优化企业云端资源的关键工具

引言 在当今数字化时代&#xff0c;企业普遍倾向于利用多个云服务提供商的优势&#xff0c;以满足不同的需求和业务场景。这种多云环境带来了灵活性和选择性的提升&#xff0c;同时也带来了一系列的挑战。在这样的环境中&#xff0c;多云管理软件成为了企业的关键工具。 多云管…

Python学习之复习MySQL-Day6(约束)

目录 文章声明⭐⭐⭐让我们开始今天的学习吧&#xff01;约束简介概念目的分类 约束演示外键约束概念添加外键删除外键删除/更新行为 文章声明⭐⭐⭐ 该文章为我&#xff08;有编程语言基础&#xff0c;非编程小白&#xff09;的 MySQL复习笔记知识来源为 B站UP主&#xff08;…

【vue】jenkins打前端包时报错:第 8 行:cd: dist: 没有那个文件或目录

问题描述 jenkins打前端包时报错&#xff1a;第 8 行&#x1f4bf; dist: 没有那个文件或目录 Jenkins中 “Execute shell” 配置的脚本&#xff1a; echo $PATH node -v npm -v npm config set registry http://ued.edtsoft.com/ npm install npm run build:prod cd dist rm…

鸿蒙开发ArkTS语言-XML解析

XML概述 XML&#xff08;可扩展标记语言&#xff09;是一种用于描述数据的标记语言&#xff0c;旨在提供一种通用的方式来传输和存储数据&#xff0c;特别是Web应用程序中经常使用的数据。XML并不预定义标记。因此&#xff0c;XML更加灵活&#xff0c;并且可以适用于广泛的应用…

微服务实战系列之ZooKeeper(上)

前言 历经1个多月的创作和总结&#xff0c;纵观博主微服务系列博文&#xff0c;大致脉络覆盖了以下几个方面&#xff1a; 数据方面&#xff08;缓存&安全&#xff09; 比如Redis、MemCache、Ehcache、J2cache&#xff08;两级缓存框架&#xff09;、RSA加密、Sign签名…传…

C#上位机与欧姆龙PLC的通信02----搭建仿真环境

在没有硬件的情况下&#xff0c;创建仿真环境非常必要&#xff0c;买硬件需要花大几K的大洋&#xff0c;这是不好的&#xff0c;对于学习培训者来说&#xff0c;有仿真环境就特别漂亮&#xff0c;现在CX-ONE已经集成了欧姆龙的编程软件&#xff0c;能够实现仿真PLC及编程&#…