使用libcurl实现的下载器

头文件:
使用libcurl实现的下载器/**********************************************************************
使用libcurl实现的下载器* Copyright (C) 2014 -  - All Rights Reserved
使用libcurl实现的下载器*
使用libcurl实现的下载器* 文件名称:        Downloader_LibCurl.h
使用libcurl实现的下载器* 摘    要:        下载器 - LibCurl实现
使用libcurl实现的下载器*     
使用libcurl实现的下载器* 作    者:        yanglinbo,
使用libcurl实现的下载器* 修    改:        查看文件最下方.
使用libcurl实现的下载器
使用libcurl实现的下载器**********************************************************************
*/

使用libcurl实现的下载器
使用libcurl实现的下载器#ifndef __Downloader_LibCurl_H__
使用libcurl实现的下载器#define __Downloader_LibCurl_H__
使用libcurl实现的下载器
使用libcurl实现的下载器
使用libcurl实现的下载器#include <curl/curl.h>
使用libcurl实现的下载器#include <fstream>
使用libcurl实现的下载器#include <string>
使用libcurl实现的下载器
使用libcurl实现的下载器
使用libcurl实现的下载器class CDownloader
使用libcurl实现的下载器{
使用libcurl实现的下载器public:
使用libcurl实现的下载器    CDownloader(void);
使用libcurl实现的下载器    virtual ~CDownloader(void);
使用libcurl实现的下载器
使用libcurl实现的下载器public:
使用libcurl实现的下载器    /// 线程入口函数
使用libcurl实现的下载器    virtual bool run();
使用libcurl实现的下载器
使用libcurl实现的下载器    /// 启动下载
使用libcurl实现的下载器    virtual bool start(const std::string& strUrl, const std::string& strLocalFile);
使用libcurl实现的下载器
使用libcurl实现的下载器    /// 停止下载
使用libcurl实现的下载器    virtual bool stop();
使用libcurl实现的下载器
使用libcurl实现的下载器    /// 是否运行状态
使用libcurl实现的下载器    bool isRunning() const;
使用libcurl实现的下载器
使用libcurl实现的下载器protected:
使用libcurl实现的下载器    /// 写入回调
使用libcurl实现的下载器    static size_t handleWrite(void *buffer, size_t size, size_t nmemb, void *userp);
使用libcurl实现的下载器
使用libcurl实现的下载器    /// 进度回调
使用libcurl实现的下载器    static size_t handleProgress(void *buffer, double dltotal, double dlnow, double ultotal, double ulnow);
使用libcurl实现的下载器
使用libcurl实现的下载器protected:
使用libcurl实现的下载器    /// 写入回调
使用libcurl实现的下载器    size_t onWrite(void *buffer, size_t size, size_t nmemb);
使用libcurl实现的下载器
使用libcurl实现的下载器    /// 进度回调
使用libcurl实现的下载器    size_t onProgress(const double& dltotal, const double& dlnow);
使用libcurl实现的下载器
使用libcurl实现的下载器    /// 下载回调
使用libcurl实现的下载器    void onDownload();
使用libcurl实现的下载器
使用libcurl实现的下载器protected:
使用libcurl实现的下载器    /// 设置libcurl选项
使用libcurl实现的下载器    void setOption();
使用libcurl实现的下载器
使用libcurl实现的下载器    /// 清除数据
使用libcurl实现的下载器    void clear();
使用libcurl实现的下载器
使用libcurl实现的下载器protected:
使用libcurl实现的下载器    CURL*            m_pCurl;                ///< libcurl句柄
使用libcurl实现的下载器
    FILE*            m_pFile;                ///< 文件指针
使用libcurl实现的下载器

使用libcurl实现的下载器    bool            m_bRunning;                ///< 运行标志
使用libcurl实现的下载器

使用libcurl实现的下载器    std::string        m_strDownloadUrl;        ///< 下载链接
使用libcurl实现的下载器
    std::string        m_strLocalFilePath;        ///< 本地文件路径
使用libcurl实现的下载器
};

使用libcurl实现的下载器
使用libcurl实现的下载器
使用libcurl实现的下载器#endif
使用libcurl实现的下载器


实现文件:
使用libcurl实现的下载器/**********************************************************************
使用libcurl实现的下载器* Copyright (C) 2014 -  - All Rights Reserved
使用libcurl实现的下载器*
使用libcurl实现的下载器* 文件名称:        Downloader_LibCurl.cpp
使用libcurl实现的下载器* 摘    要:        下载器 - LibCurl实现
使用libcurl实现的下载器*     
使用libcurl实现的下载器* 作    者:        yanglinbo,
使用libcurl实现的下载器* 修    改:        查看文件最下方.
使用libcurl实现的下载器
使用libcurl实现的下载器**********************************************************************
*/

使用libcurl实现的下载器
使用libcurl实现的下载器#include "StdAfx.h"
使用libcurl实现的下载器#include "Downloader.h"
使用libcurl实现的下载器
使用libcurl实现的下载器
使用libcurl实现的下载器CDownloader::CDownloader(void)
使用libcurl实现的下载器: m_pCurl(NULL)
使用libcurl实现的下载器, m_pFile(NULL)
使用libcurl实现的下载器, m_bRunning(false)
使用libcurl实现的下载器{
使用libcurl实现的下载器}

使用libcurl实现的下载器
使用libcurl实现的下载器CDownloader::~CDownloader(void)
使用libcurl实现的下载器{
使用libcurl实现的下载器    stop();
使用libcurl实现的下载器}

使用libcurl实现的下载器
使用libcurl实现的下载器bool CDownloader::run()
使用libcurl实现的下载器{
使用libcurl实现的下载器    onDownload();
使用libcurl实现的下载器    return true;
使用libcurl实现的下载器}

使用libcurl实现的下载器
使用libcurl实现的下载器bool CDownloader::isRunning() const
使用libcurl实现的下载器{
使用libcurl实现的下载器    return m_bRunning;
使用libcurl实现的下载器}

使用libcurl实现的下载器
使用libcurl实现的下载器void CDownloader::clear()
使用libcurl实现的下载器{
使用libcurl实现的下载器    if (m_pFile)
使用libcurl实现的下载器    {
使用libcurl实现的下载器        fclose(m_pFile);
使用libcurl实现的下载器        m_pFile = NULL;
使用libcurl实现的下载器    }

使用libcurl实现的下载器
使用libcurl实现的下载器    if (m_pCurl)
使用libcurl实现的下载器    {
使用libcurl实现的下载器        curl_easy_cleanup(m_pCurl);
使用libcurl实现的下载器        m_pCurl = NULL;
使用libcurl实现的下载器        curl_global_cleanup();
使用libcurl实现的下载器    }

使用libcurl实现的下载器
使用libcurl实现的下载器    m_strDownloadUrl.clear();
使用libcurl实现的下载器    m_strLocalFilePath.clear();
使用libcurl实现的下载器}

使用libcurl实现的下载器
使用libcurl实现的下载器void CDownloader::setOption()
使用libcurl实现的下载器{
使用libcurl实现的下载器    // 远程URL,支持 http, https, ftp
使用libcurl实现的下载器
    curl_easy_setopt(m_pCurl, CURLOPT_URL, m_strDownloadUrl.c_str());
使用libcurl实现的下载器
使用libcurl实现的下载器    // 设置User-Agent
使用libcurl实现的下载器
    std::string useragent = _T("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1");
使用libcurl实现的下载器    curl_easy_setopt(m_pCurl, CURLOPT_USERAGENT, useragent.c_str());
使用libcurl实现的下载器
使用libcurl实现的下载器    // 设置重定向的最大次数
使用libcurl实现的下载器
    curl_easy_setopt(m_pCurl, CURLOPT_MAXREDIRS, 5);
使用libcurl实现的下载器
使用libcurl实现的下载器    // 设置301、302跳转跟随location
使用libcurl实现的下载器
    curl_easy_setopt(m_pCurl, CURLOPT_FOLLOWLOCATION, 1);
使用libcurl实现的下载器
使用libcurl实现的下载器    curl_easy_setopt(m_pCurl, CURLOPT_NOSIGNAL, 1L);
使用libcurl实现的下载器    curl_easy_setopt(m_pCurl, CURLOPT_POST, false);
使用libcurl实现的下载器
使用libcurl实现的下载器    // 下载内容回调函数
使用libcurl实现的下载器
    curl_easy_setopt(m_pCurl, CURLOPT_WRITEFUNCTION, handleWrite);
使用libcurl实现的下载器    curl_easy_setopt(m_pCurl, CURLOPT_WRITEDATA, this);
使用libcurl实现的下载器
使用libcurl实现的下载器    // 进度回调函数
使用libcurl实现的下载器
    curl_easy_setopt(m_pCurl, CURLOPT_NOPROGRESS, 0);
使用libcurl实现的下载器    curl_easy_setopt(m_pCurl, CURLOPT_PROGRESSDATA, this);
使用libcurl实现的下载器    curl_easy_setopt(m_pCurl, CURLOPT_PROGRESSFUNCTION, handleProgress);
使用libcurl实现的下载器
使用libcurl实现的下载器    // 跳过服务器SSL验证,不使用CA证书
使用libcurl实现的下载器
    curl_easy_setopt(m_pCurl, CURLOPT_SSL_VERIFYPEER, 0L);
使用libcurl实现的下载器
使用libcurl实现的下载器    // 验证服务器端发送的证书,默认是 2(高),1(中),0(禁用)
使用libcurl实现的下载器
    curl_easy_setopt(m_pCurl, CURLOPT_SSL_VERIFYHOST, 0L);
使用libcurl实现的下载器}

使用libcurl实现的下载器
使用libcurl实现的下载器bool CDownloader::start(const std::string& strUrl, const std::string& strLocalFile)
使用libcurl实现的下载器{
使用libcurl实现的下载器    if (strUrl.empty()) return false;
使用libcurl实现的下载器
使用libcurl实现的下载器    if (m_bRunning == truereturn true;
使用libcurl实现的下载器
使用libcurl实现的下载器    clear();
使用libcurl实现的下载器
使用libcurl实现的下载器    m_strDownloadUrl    = strUrl;
使用libcurl实现的下载器    m_strLocalFilePath    = strLocalFile;
使用libcurl实现的下载器
使用libcurl实现的下载器    // 初始化libcurl
使用libcurl实现的下载器
    m_pCurl = curl_easy_init();
使用libcurl实现的下载器    if (m_pCurl == NULL)
使用libcurl实现的下载器    {
使用libcurl实现的下载器        return false;
使用libcurl实现的下载器    }

使用libcurl实现的下载器
使用libcurl实现的下载器    // 设置libcurl的选项
使用libcurl实现的下载器
    setOption();
使用libcurl实现的下载器
使用libcurl实现的下载器    // 创建文件
使用libcurl实现的下载器
    m_pFile = fopen(m_strLocalFilePath.c_str(), "wb");
使用libcurl实现的下载器    if (m_pFile == NULL)
使用libcurl实现的下载器    {
使用libcurl实现的下载器        return false;
使用libcurl实现的下载器    }

使用libcurl实现的下载器
使用libcurl实现的下载器    m_bRunning = true;
使用libcurl实现的下载器
使用libcurl实现的下载器    return true;
使用libcurl实现的下载器}

使用libcurl实现的下载器
使用libcurl实现的下载器bool CDownloader::stop()
使用libcurl实现的下载器{
使用libcurl实现的下载器    clear();
使用libcurl实现的下载器
使用libcurl实现的下载器    m_bRunning = false;
使用libcurl实现的下载器
使用libcurl实现的下载器    return true;
使用libcurl实现的下载器}

使用libcurl实现的下载器
使用libcurl实现的下载器size_t CDownloader::handleWrite( void *buffer, size_t size, size_t nmemb, void *userp )
使用libcurl实现的下载器{
使用libcurl实现的下载器    CDownloader* pDownloader = (CDownloader*) userp;
使用libcurl实现的下载器    if (pDownloader)
使用libcurl实现的下载器    {
使用libcurl实现的下载器        return pDownloader->onWrite(buffer, size, nmemb);
使用libcurl实现的下载器    }

使用libcurl实现的下载器    return 0;
使用libcurl实现的下载器}

使用libcurl实现的下载器
使用libcurl实现的下载器size_t CDownloader::handleProgress( void *buffer, double dltotal, double dlnow, double ultotal, double ulnow )
使用libcurl实现的下载器{
使用libcurl实现的下载器    CDownloader* pDownloader = (CDownloader*) buffer;
使用libcurl实现的下载器    if (pDownloader)
使用libcurl实现的下载器    {
使用libcurl实现的下载器        pDownloader->onProgress(dltotal, dlnow);
使用libcurl实现的下载器    }

使用libcurl实现的下载器    return 0;
使用libcurl实现的下载器}

使用libcurl实现的下载器
使用libcurl实现的下载器size_t CDownloader::onProgress( const double& dltotal, const double& dlnow )
使用libcurl实现的下载器{
使用libcurl实现的下载器    TRACE("%.2f / %.2f (%.2g %%)\n", dlnow, dltotal, dlnow*100.0/dltotal);
使用libcurl实现的下载器    return 0;
使用libcurl实现的下载器}

使用libcurl实现的下载器
使用libcurl实现的下载器size_t CDownloader::onWrite( void *buffer, size_t size, size_t nmemb )
使用libcurl实现的下载器{
使用libcurl实现的下载器    size_t return_size = fwrite(buffer, size, nmemb, m_pFile);
使用libcurl实现的下载器    //std::cout << (char*) buffer << std::endl;
使用libcurl实现的下载器
    return return_size;
使用libcurl实现的下载器}

使用libcurl实现的下载器
使用libcurl实现的下载器void CDownloader::onDownload()
使用libcurl实现的下载器{
使用libcurl实现的下载器    // 执行下载
使用libcurl实现的下载器
    CURLcode return_code = CURLE_OK;
使用libcurl实现的下载器    return_code = curl_easy_perform(m_pCurl);
使用libcurl实现的下载器
使用libcurl实现的下载器    // 关闭文件
使用libcurl实现的下载器
    if (m_pFile)
使用libcurl实现的下载器    {
使用libcurl实现的下载器        fclose(m_pFile);
使用libcurl实现的下载器        m_pFile = NULL;
使用libcurl实现的下载器    }

使用libcurl实现的下载器
使用libcurl实现的下载器    // 下载失败
使用libcurl实现的下载器
    if (return_code != CURLE_OK)
使用libcurl实现的下载器    {
使用libcurl实现的下载器        return;
使用libcurl实现的下载器    }

使用libcurl实现的下载器
使用libcurl实现的下载器    // 获取状态码
使用libcurl实现的下载器
    int response_code = 0;
使用libcurl实现的下载器    curl_easy_getinfo(m_pCurl, CURLINFO_RESPONSE_CODE, &response_code);
使用libcurl实现的下载器    if (response_code != 200)
使用libcurl实现的下载器    {
使用libcurl实现的下载器        return;
使用libcurl实现的下载器    }

使用libcurl实现的下载器}

使用libcurl实现的下载器

使用示例:
使用libcurl实现的下载器CDownloader downloader;
使用libcurl实现的下载器downloader.start("http://xingke.onlinedown.net:82/down/QQ2013SP6.zip", "QQ2013SP6.zip");
使用libcurl实现的下载器downloader.run();

需要说明的是,这个类本身其实是运行于线程环境下的,因此,加入到多线程环境下,并非难事。扩展或者修改也并不是难得事情,比之WinInet的实现来说,libcurl的实现实在是简单得无话可说。
上一篇:ssh框架整合实例子-web层


下一篇:Kubernetes必备知识: 主流网络方案