zoukankan      html  css  js  c++  java
  • (转)libcurl应用:如何把下载内容写入内存

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

    2008-01-13 00:32:52|  分类: 默认分类 |举报 |字号 订阅

     

    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 ");
            exit(EXIT_FAILURE);
        }
        code = curl_easy_perform(conn);
      
        if (code != CURLE_OK)
        {
            fprintf(stderr, "Failed to get '%s' [%s] ", url, errorBuffer);
            exit(EXIT_FAILURE);
        }
     curl_easy_cleanup(conn);
     printf("%s ",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 ");
            exit(EXIT_FAILURE);
        }
        code = curl_easy_setopt(conn, CURLOPT_ERRORBUFFER, errorBuffer);
        if (code != CURLE_OK)
        {
            fprintf(stderr, "Failed to set error buffer [%d] ", code);
            return false;
        }
        code = curl_easy_setopt(conn, CURLOPT_URL, url);
        if (code != CURLE_OK)
        {
            fprintf(stderr, "Failed to set URL [%s] ", errorBuffer);
            return false;
        }
        code = curl_easy_setopt(conn, CURLOPT_FOLLOWLOCATION, 1);
        if (code != CURLE_OK)
        {
            fprintf(stderr, "Failed to set redirect option [%s] ", errorBuffer);
            return false;
        }
        code = curl_easy_setopt(conn, CURLOPT_WRITEFUNCTION, writer);
        if (code != CURLE_OK)
        {
            fprintf(stderr, "Failed to set writer [%s] ", errorBuffer);
            return false;
        }
        code = curl_easy_setopt(conn, CURLOPT_WRITEDATA, p_buffer);
        if (code != CURLE_OK)
        {
            fprintf(stderr, "Failed to set write data [%s] ", 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;
    }

  • 相关阅读:
    Java编码思想之什么是高内聚低耦合?
    hadoop中block副本的放置策略
    服务器组网的过程
    服务器的类型
    hadoop学习笔记(一):NameNade持久化和DataNode概念
    js中的局部函数和全局函数的调用
    对于javaScript中的alert和document.write()的执行顺序的记录
    常用工具api等链接
    js函数声明外面使用小括号括起来再接一个小括号的写法
    LVS的概念和重要性
  • 原文地址:https://www.cnblogs.com/zhaitao85/p/3630817.html
Copyright © 2011-2022 走看看