• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            使用libcurl實現的下載器

            libcurl的主頁:http://curl.haxx.se/

            頭文件:
            /**********************************************************************
            * Copyright (C) 2014 -  - All Rights Reserved
            *
            * 文件名稱:        Downloader_LibCurl.h
            * 摘    要:        下載器 - LibCurl實現
            *     
            * 作    者:        yanglinbo,
            * 修    改:        查看文件最下方.

            **********************************************************************
            */


            #ifndef __Downloader_LibCurl_H__
            #define __Downloader_LibCurl_H__


            #include 
            <curl/curl.h>
            #include 
            <fstream>
            #include 
            <string>


            class CDownloader
            {
            public:
                CDownloader(
            void);
                
            virtual ~CDownloader(void);

            public:
                
            /// 線程入口函數
                virtual bool run();

                
            /// 啟動下載
                virtual bool start(const std::string& strUrl, const std::string& strLocalFile);

                
            /// 停止下載
                virtual bool stop();

                
            /// 是否運行狀態
                bool isRunning() const;

            protected:
                
            /// 寫入回調
                static size_t handleWrite(void *buffer, size_t size, size_t nmemb, void *userp);

                
            /// 進度回調
                static size_t handleProgress(void *buffer, double dltotal, double dlnow, double ultotal, double ulnow);

            protected:
                
            /// 寫入回調
                size_t onWrite(void *buffer, size_t size, size_t nmemb);

                
            /// 進度回調
                size_t onProgress(const double& dltotal, const double& dlnow);

                
            /// 下載回調
                void onDownload();

            protected:
                
            /// 設置libcurl選項
                void setOption();

                
            /// 清除數據
                void clear();

            protected:
                CURL
            *            m_pCurl;                ///< libcurl句柄
                FILE*            m_pFile;                ///< 文件指針

                bool            m_bRunning;                ///< 運行標志

                std::string        m_strDownloadUrl;        ///< 下載鏈接
                std::string        m_strLocalFilePath;        ///< 本地文件路徑
            };



            #endif


            實現文件:
            /**********************************************************************
            * Copyright (C) 2014 -  - All Rights Reserved
            *
            * 文件名稱:        Downloader_LibCurl.cpp
            * 摘    要:        下載器 - LibCurl實現
            *     
            * 作    者:        yanglinbo,
            * 修    改:        查看文件最下方.

            **********************************************************************
            */


            #include 
            "StdAfx.h"
            #include 
            "Downloader.h"


            CDownloader::CDownloader(
            void)
            : m_pCurl(NULL)
            , m_pFile(NULL)
            , m_bRunning(
            false)
            {
            }


            CDownloader::
            ~CDownloader(void)
            {
                stop();
            }


            bool CDownloader::run()
            {
                onDownload();
                
            return true;
            }


            bool CDownloader::isRunning() const
            {
                
            return m_bRunning;
            }


            void CDownloader::clear()
            {
                
            if (m_pFile)
                
            {
                    fclose(m_pFile);
                    m_pFile 
            = NULL;
                }


                
            if (m_pCurl)
                
            {
                    curl_easy_cleanup(m_pCurl);
                    m_pCurl 
            = NULL;
                    curl_global_cleanup();
                }


                m_strDownloadUrl.clear();
                m_strLocalFilePath.clear();
            }


            void CDownloader::setOption()
            {
                
            // 遠程URL,支持 http, https, ftp
                curl_easy_setopt(m_pCurl, CURLOPT_URL, m_strDownloadUrl.c_str());

                
            // 設置User-Agent
                std::string useragent = _T("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1");
                curl_easy_setopt(m_pCurl, CURLOPT_USERAGENT, useragent.c_str());

                
            // 設置重定向的最大次數
                curl_easy_setopt(m_pCurl, CURLOPT_MAXREDIRS, 5);

                
            // 設置301、302跳轉跟隨location
                curl_easy_setopt(m_pCurl, CURLOPT_FOLLOWLOCATION, 1);

                curl_easy_setopt(m_pCurl, CURLOPT_NOSIGNAL, 
            1L);
                curl_easy_setopt(m_pCurl, CURLOPT_POST, 
            false);

                
            // 下載內容回調函數
                curl_easy_setopt(m_pCurl, CURLOPT_WRITEFUNCTION, handleWrite);
                curl_easy_setopt(m_pCurl, CURLOPT_WRITEDATA, 
            this);

                
            // 進度回調函數
                curl_easy_setopt(m_pCurl, CURLOPT_NOPROGRESS, 0);
                curl_easy_setopt(m_pCurl, CURLOPT_PROGRESSDATA, 
            this);
                curl_easy_setopt(m_pCurl, CURLOPT_PROGRESSFUNCTION, handleProgress);

                
            // 跳過服務器SSL驗證,不使用CA證書
                curl_easy_setopt(m_pCurl, CURLOPT_SSL_VERIFYPEER, 0L);

                
            // 驗證服務器端發送的證書,默認是 2(高),1(中),0(禁用)
                curl_easy_setopt(m_pCurl, CURLOPT_SSL_VERIFYHOST, 0L);
            }


            bool CDownloader::start(const std::string& strUrl, const std::string& strLocalFile)
            {
                
            if (strUrl.empty()) return false;

                
            if (m_bRunning == truereturn true;

                clear();

                m_strDownloadUrl    
            = strUrl;
                m_strLocalFilePath    
            = strLocalFile;

                
            // 初始化libcurl
                m_pCurl = curl_easy_init();
                
            if (m_pCurl == NULL)
                
            {
                    
            return false;
                }


                
            // 設置libcurl的選項
                setOption();

                
            // 創建文件
                m_pFile = fopen(m_strLocalFilePath.c_str(), "wb");
                
            if (m_pFile == NULL)
                
            {
                    
            return false;
                }


                m_bRunning 
            = true;

                
            return true;
            }


            bool CDownloader::stop()
            {
                clear();

                m_bRunning 
            = false;

                
            return true;
            }


            size_t CDownloader::handleWrite( 
            void *buffer, size_t size, size_t nmemb, void *userp )
            {
                CDownloader
            * pDownloader = (CDownloader*) userp;
                
            if (pDownloader)
                
            {
                    
            return pDownloader->onWrite(buffer, size, nmemb);
                }

                
            return 0;
            }


            size_t CDownloader::handleProgress( 
            void *buffer, double dltotal, double dlnow, double ultotal, double ulnow )
            {
                CDownloader
            * pDownloader = (CDownloader*) buffer;
                
            if (pDownloader)
                
            {
                    pDownloader
            ->onProgress(dltotal, dlnow);
                }

                
            return 0;
            }


            size_t CDownloader::onProgress( 
            const double& dltotal, const double& dlnow )
            {
                TRACE(
            "%.2f / %.2f (%.2g %%)\n", dlnow, dltotal, dlnow*100.0/dltotal);
                
            return 0;
            }


            size_t CDownloader::onWrite( 
            void *buffer, size_t size, size_t nmemb )
            {
                size_t return_size 
            = fwrite(buffer, size, nmemb, m_pFile);
                
            //std::cout << (char*) buffer << std::endl;
                return return_size;
            }


            void CDownloader::onDownload()
            {
                
            // 執行下載
                CURLcode return_code = CURLE_OK;
                return_code 
            = curl_easy_perform(m_pCurl);

                
            // 關閉文件
                if (m_pFile)
                
            {
                    fclose(m_pFile);
                    m_pFile = NULL;
                }


                
            // 下載失敗
                if (return_code != CURLE_OK)
                
            {
                    
            return;
                }


                
            // 獲取狀態碼
                int response_code = 0;
                curl_easy_getinfo(m_pCurl, CURLINFO_RESPONSE_CODE, 
            &response_code);
                
            if (response_code != 200)
                
            {
                    
            return;
                }

            }


            使用示例:
            CDownloader downloader;
            downloader.start(
            "http://xingke.onlinedown.net:82/down/QQ2013SP6.zip""QQ2013SP6.zip");
            downloader.run();

            需要說明的是,這個類本身其實是運行于線程環境下的,因此,加入到多線程環境下,并非難事。擴展或者修改也并不是難得事情,比之WinInet的實現來說,libcurl的實現實在是簡單得無話可說。

            posted on 2014-03-26 01:19 楊粼波 閱讀(2043) 評論(0)  編輯 收藏 引用

            久久中文字幕人妻丝袜| 久久久国产乱子伦精品作者| 国产精品久久久久一区二区三区| 99久久99久久精品国产| 久久精品国产99国产精品| A级毛片无码久久精品免费| 亚洲国产成人精品91久久久| 无码精品久久久久久人妻中字| 国产精品久久久久久久久| 国产激情久久久久影院老熟女免费| 国产精品久久久久影院嫩草| 久久久久国产亚洲AV麻豆| 久久久这里有精品| 国产91久久综合| 久久A级毛片免费观看| 一本大道久久香蕉成人网| 国产一级持黄大片99久久| 亚洲精品午夜国产va久久| 久久青青草原国产精品免费| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 久久国产精品免费一区二区三区 | 精品久久久久久无码免费| 久久精品一本到99热免费| 99久久国产综合精品五月天喷水| 伊人久久亚洲综合影院| 99久久精品费精品国产| 久久人妻少妇嫩草AV无码专区| 日韩欧美亚洲综合久久| 久久精品国产亚洲一区二区三区 | 三上悠亚久久精品| 久久综合丁香激情久久| 婷婷久久香蕉五月综合加勒比| 亚洲国产小视频精品久久久三级| 1000部精品久久久久久久久| 久久久无码精品午夜| 久久精品国产精品亚洲人人| 欧美久久综合性欧美| 国产成人久久精品激情 | 国产精品久久新婚兰兰| 亚洲国产日韩综合久久精品| 人妻无码精品久久亚瑟影视|