libcurl应用:如何把下载内容写入内存
来源:互联网 发布:淘宝上显示新品怎么弄 编辑:程序博客网 时间:2024/06/02 14:34
libcurl的文档中有getinmemory.c这个例子,把下载的网页写入自己定义的一个memorystruct中,看了这个例子的做法,它需要自己照顾内存的开辟,特别是需要在curl_easy_perform的调用函数中释放已开辟的内存,很不利于函数的封装,而且应用于multihandle的时候,运行时会出莫名其妙的assert错误。因此改写了一下,将下载的内容放入stl的string中,这样根本不需要自己照顾内存的开辟和释放。源代码如下:
#include <string>
#include "curl.h"
using namespace std;
static char errorBuffer[CURL_ERROR_SIZE];
static int writer(char *, size_t, size_t, string *);
static bool init(CURL *&, char *,string *);
int main()
{
CURL *conn = NULL;
CURLcode code;
string buffer;
curl_global_init(CURL_GLOBAL_DEFAULT);
char* url="http://cool.haxx.se/";
if (!init(conn,url,&buffer ))
{
fprintf(stderr, "Connection initializion failed/n");
exit(EXIT_FAILURE);
}
code = curl_easy_perform(conn);
if (code != CURLE_OK)
{
fprintf(stderr, "Failed to get '%s' [%s]/n", url, errorBuffer);
exit(EXIT_FAILURE);
}
curl_easy_cleanup(conn);
printf("%s/n",buffer.c_str());
return 0;
}
static bool init(CURL *&conn, char *url,string *p_buffer)
{
CURLcode code;
conn = curl_easy_init();
if (conn == NULL)
{
fprintf(stderr, "Failed to create CURL connection/n");
exit(EXIT_FAILURE);
}
code = curl_easy_setopt(conn, CURLOPT_ERRORBUFFER, errorBuffer);
if (code != CURLE_OK)
{
fprintf(stderr, "Failed to set error buffer [%d]/n", code);
return false;
}
code = curl_easy_setopt(conn, CURLOPT_URL, url);
if (code != CURLE_OK)
{
fprintf(stderr, "Failed to set URL [%s]/n", errorBuffer);
return false;
}
code = curl_easy_setopt(conn, CURLOPT_FOLLOWLOCATION, 1);
if (code != CURLE_OK)
{
fprintf(stderr, "Failed to set redirect option [%s]/n", errorBuffer);
return false;
}
code = curl_easy_setopt(conn, CURLOPT_WRITEFUNCTION, writer);
if (code != CURLE_OK)
{
fprintf(stderr, "Failed to set writer [%s]/n", errorBuffer);
return false;
}
code = curl_easy_setopt(conn, CURLOPT_WRITEDATA, p_buffer);
if (code != CURLE_OK)
{
fprintf(stderr, "Failed to set write data [%s]/n", errorBuffer);
return false;
}
return true;
}
static int writer(char *data, size_t size, size_t nmemb, string *writerData)
{
unsigned long sizes = size * nmemb;
if (writerData == NULL) return 0;
writerData->append(data, sizes);
return sizes;
}
- libcurl应用 libcurl应用:如何把下载内容写入内存
- libcurl应用:如何把下载内容写入内存
- libcurl应用:如何把下载内容写入内存
- libcurl应用:如何把下载内容写入内存
- 如何把数据库的内容写入到Word文档中
- 如何把数据库的内容写入到Word文档中?
- 把内容写入硬盘文件
- 把文本内容写入文件
- 把内容写入TXT文件
- 把二进制内容写入文件
- IOS应用发布NSLog的注释及使用重定向,把控制台内容写入文件
- JAVA中如何把system.out.println里的内容写入文件
- 如何把控制台输入的内容写入到指定的文件中
- C++怎样把内容写入指定路径?
- 如何把多线程下载的数据按位置写入一个文件
- 第二天! 把文件写入ROM内存
- 请问如何把指定的内容写入到事先做好的word模板中,然后新生成一个word文件
- 如何把资源中的文件写入磁盘
- FreeTextBox has not been correctly installed. To install FreeTextBox either:
- 请等待通知
- C&C++语言小知识点
- const用法
- oracle性能调整的十大要点
- libcurl应用:如何把下载内容写入内存
- java代码生成器
- SQL2005 备份问题
- MiniUtilityFramework(三):配置文件概述
- MiniUtilityFramework(四):CDominatorBase
- Java应用基础:网友精选25个Java试题分享
- 使用Myeclipse开发Hibernate框架应用步骤
- 23种设计模式学习之东拼西凑-------工厂方法模式
- MiniUtilityFramework(五):CUserWnd