libcurl应用:如何把下载内容写入内存

来源:互联网 发布:数据库概念模型的定义 编辑:程序博客网 时间:2024/05/21 22:45
#include <stdlib.h>
#include <stdio.h>
#include <curl/curl.h>
#include <curl/easy.h>
#include <string>
#include <iostream>

using namespace std;

static char errorBuffer[1024];
static bool init(CURL *&, const char *,string *);
static int writer(char *, size_t, size_t, string *);

int main()
{    
    string                     buffer;
    CURLcode                   code;
    CURL*                      curl = NULL;
    
    const char* url = "http://www.baidu.com";
    
    code = curl_global_init(CURL_GLOBAL_DEFAULT);
    printf("code = %d\n", code);
    
//    curl = curl_easy_init();
    if(!init(curl, url, &buffer))
    {
        fprintf(stderr, "Connection initializion failed\n");
        exit(EXIT_FAILURE);
    }

    code = curl_easy_perform(curl);
    if (code != CURLE_OK)
    {
        fprintf(stderr, "Failed to get '%s' [%s]\n", url, errorBuffer);
        exit(EXIT_FAILURE);
    }
    
    curl_easy_cleanup(curl);
    printf("%s\n",buffer.c_str());
        
    return 0;
}

static bool init(CURL *&curl, const char *url, string *p_buffer)
{
    CURLcode code;
    
    curl = curl_easy_init();
    if (curl == NULL)
    {
        fprintf(stderr, "Failed to create CURL connection\n");
        exit(EXIT_FAILURE);
    }
    
    code = curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
    if (code != CURLE_OK)
    {
        fprintf(stderr, "Failed to set error buffer [%d]\n", code);
        return false;
    }
    
    code = curl_easy_setopt(curl, CURLOPT_URL, url);
    if (code != CURLE_OK)
    {
        fprintf(stderr, "Failed to set URL [%s]\n", errorBuffer);
        return false;
    }
    
    code = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
    if (code != CURLE_OK)
    {
        fprintf(stderr, "Failed to set writer [%s]\n", errorBuffer);
        return false;
    }
    
    code = curl_easy_setopt(curl, 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;
}
原创粉丝点击