• (转)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 jar 后台运行
    【Objective-C】内存管理
    GitHub Gist 指南
    模板发送java邮件
    JDK环境配置
    新装mysql数据库登陆不上去(账号密码正确)
    一个简单的爬取b站up下所有视频的所有评论信息的爬虫
    hexo Nunjucks Errors 解决方法
    新版正方教务系统导出课程表-油猴脚本
    ACM-图论-同余最短路
  • 原文地址:https://www.cnblogs.com/zhaitao85/p/3630817.html
Copyright © 2020-2023  润新知