zoukankan      html  css  js  c++  java
  • libcurl使用http、https下载文件

    libcurl

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <curl/curl.h>
    
    #include <string>
    #include <functional>
    
    
    struct MemoryStruct
    {
        char *memory;
        size_t size;
    };
    
    using Callback = std::function<void(const MemoryStruct &m)>;
    
    static size_t
    WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
    {
        size_t realsize = size * nmemb;
        struct MemoryStruct *mem = (struct MemoryStruct *)userp;
        mem->memory = (char*)realloc(mem->memory, mem->size + realsize);
        if (mem->memory == NULL) {
            /* out of memory! */
            printf("not enough memory (realloc returned NULL)
    ");
            return 0;
        }
        memcpy(&(mem->memory[mem->size]), contents, realsize);
        mem->size += realsize;
        mem->memory[mem->size] = 0;
        return realsize;
    }
    
    class CurlDownload
    {
    public:
        CurlDownload(){}
        CURLcode Initialize()
        {
            CURLcode error;
    
            curl_global_init(CURL_GLOBAL_ALL);
            /* init the curl session */
            curl_handle = curl_easy_init();
            ///* specify URL to get */
            //curl_easy_setopt(curl_handle, CURLOPT_URL, const_cast<char*>(strUrl.c_str()));
            ////curl_easy_setopt(curl_handle, CURLOPT_URL, "http://10.66.91.15:7777/ld/smog/2612_src.jpg");
    
            /* send all data to this function */
            curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
            /* we pass our 'chunk' struct to the callback function */
            curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
    
            curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1);
    
    
            /* some servers don't like requests that are made without a user-agent
            field, so we provide one */
            //curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
    
            // https, skip the verification of the server's certificate.
            curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, 0L);
            curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYHOST, 0L);
    
            /* 设置连接超时,单位:毫秒 */
            curl_easy_setopt(curl_handle, CURLOPT_CONNECTTIMEOUT_MS, 1000L);
    
            // add by yexiaoyogn 10 second time out 
            curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT_MS, 2000);
    
            //add yexiaoyong set time out
            curl_easy_setopt(curl_handle, CURLOPT_NOSIGNAL, 3);
        }
    
        void SetCallback(Callback cb)
        {
            callback = cb;
        }
    
        CURLcode Download(std::string strUrl)
        {
            CURLcode res;
    
            /* specify URL to get */
            curl_easy_setopt(curl_handle, CURLOPT_URL, const_cast<char*>(strUrl.c_str()));
            //curl_easy_setopt(curl_handle, CURLOPT_URL, "http://10.66.91.15:7777/ld/smog/2612_src.jpg");
    
            chunk.size = 0;
    
            /* get it! */
            res = curl_easy_perform(curl_handle);
            /* check for errors */
            if (res != CURLE_OK) {
                fprintf(stderr, "curl_easy_perform() failed: %s
    ", curl_easy_strerror(res));
            }
            else {
                /*
                * Now, our chunk.memory points to a memory block that is chunk.size
                * bytes big and contains the remote file.
                *
                * Do something nice with it!
                */
                printf("%lu bytes retrieved
    ", (long)chunk.size);
            }
    
            callback(chunk);
        }
    
        void Finish()
        {
            /* cleanup curl stuff */
            curl_easy_cleanup(curl_handle);
            free(chunk.memory);
            /* we're done with libcurl, so clean it up */
            curl_global_cleanup();
        }
    
    private:
        CURL *curl_handle;
        MemoryStruct chunk;
        Callback callback;
    };
    
    
    
    void CB(const MemoryStruct &m)
    {
        static int cnt = 0;
        printf("CB: cnt:%d, %lu bytes retrieved
    ", cnt++, (long)m.size);
    }
    
    void test()
    {
        CurlDownload cd;
        cd.Initialize();
        cd.SetCallback(CB);
        while (true)
        {
            cd.Download("https://10.66.91.15/ld/smog/2612_src.jpg");
            cd.Download("http://10.66.91.15:7777/ld/smog/2612_src.jpg");
        }
        
        cd.Finish();
    }
    
    
  • 相关阅读:
    js中盒子模型常用的属性你还记得几个?
    编写一个关于浏览器盒子模型的方法
    Javascript中关于作用域和闭包和域解释的面试题
    时间格式转换
    HDU Subset sequence
    bugku never give up
    HDU 2136 Largest prime factor
    HDU 2099 整除的尾数
    杭电acm 2070
    ACM Elevator
  • 原文地址:https://www.cnblogs.com/walkinginthesun/p/9600634.html
Copyright © 2011-2022 走看看