libcur设置接收数据的回调函数以及回调函数的使用

本文介绍如何使用LibCurl设置数据读取的回调函数,并提供了具体的代码实现示例,包括如何处理大型数据及文件下载过程。
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);
LibCurl设置读取数据的回调函数

//lpVoid CURLOPT_WRITEDATA设置的缓冲区指针,buffer是libcurl内部的数据缓冲区,注意
如果读取的网页或数据特别大,那么这个函数会多次调用,所以数据必须累加起来.如下结构调用了
  str->append(pData, size * nmemb);
size是数据类型的大小,如sizeof(char),
nmemb是数据的大小.这个和fwrite等写文件的参数类似
传入的lpVoid可以是字符串,char *,或者是文件句柄.在这儿回调里面处理数据.如下面downLoadPackage

size_t CHttpClient::OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid)
{
            std::string* str = dynamic_cast<std::string*>((std::string *)lpVoid);
            if (NULL == str || NULL == buffer)
            {
                        return -1;
            }
            char* pData = (char*)buffer;
            str->append(pData, size * nmemb);
            return nmemb;
}
size_t CHttpClient::downLoadPackage(void *buffer , size_t size, size_t nmemb, void *lpVoid )
{
            FILE *fp = (FILE*)lpVoid ;
            size_t written = fwrite(buffer , size, nmemb, fp);
            return written;
}
### 如何在 Windows 上使用 libcurl #### 设置开发环境 为了能够在 Windows 平台上编译并运行基于 `libcurl` 的程序,需要先设置好开发环境。这通常涉及安装 Visual Studio 或者其他支持 C/C++ 编程的语言工具链,并配置项目来链接必要的库文件。 对于已经构建好的版本,在 E:\libcurl_build\curl-7.84.0\projects\Windows\VC14.30 文件夹下找到解决方案文件 curl-all.sln 可以通过 Microsoft Visual Studio 打开它[^1]。接着针对特定的需求调整项目的属性页中的预处理器定义以及附加依赖项等内容。 #### 添加 OpenSSL 和 LibSSH2 支持 如果计划利用 SSL/TLS 加密传输或是 SSH 协议,则还需要引入第三方的安全库如 OpenSSL 和 LibSSH2。具体操作是在对应的子工程项目里增加这两个外部库的相关路径至包含目录内以便于访问其接口函数声明。 #### 安装必要软件包 (Linux 对比) 相比之下,在 Linux 发行版上可以通过简单的命令行指令获取所需的全部组件: ```bash sudo apt-get install build-essential libssl-dev libcurl4-gnutls-dev libexpat1-dev gettext unzip ``` 不过上述方法并不适用于 Windows 用户;后者往往得手动下载源码或者二进制分发包来进行本地部署[^2]。 #### 实际应用案例分析 当考虑实际应用场景时,除了基本功能外还可能关注一些额外特性比如非阻塞模式、进度显示等。这些都可以借助多线程编程技巧或者是调用专门设计的回调机制实现[^3]。 下面给出一段简单示例代码用于展示如何发起 HTTP GET 请求: ```c++ #include <iostream> #include <string> // 导入 libcurl 库头文件 #include <curl/curl.h> using namespace std; size_t WriteCallback(void* contents, size_t size, size_t nmemb, string* userp){ size_t totalSize = size * nmemb; if(userp != NULL && totalSize > 0){ (*userp).append((char*)contents, totalSize); } return totalSize; } int main(){ CURL* curl; CURLcode res; string readBuffer; curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); if(curl) { struct curl_slist* headers = NULL; headers = curl_slist_append(headers, "Accept: application/json"); curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/api"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); // 注册写回数据处理函数指针 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); // 执行请求 res = curl_easy_perform(curl); long httpCode = 0; curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpCode); cout << "HTTP Status Code:" << httpCode << endl; if(res == CURLE_OK){ cout << "Response Body:"<<endl<<readBuffer<<endl; }else{ cerr<<"Error occurred during request."<<endl; } // 清理资源 curl_easy_cleanup(curl); curl_slist_free_all(headers); } curl_global_cleanup(); return 0; } ``` 此段代码展示了怎样发送带有自定义头部字段的 JSON API 调用,并接收服务器返回的数据流作为字符串存储起来供后续解析之用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值