• <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精品综合国产首页| 欧美亚洲另类久久综合| 色欲综合久久躁天天躁蜜桃| 一本久久a久久精品亚洲| 国产成人久久精品一区二区三区 | 日韩电影久久久被窝网| 亚洲午夜久久久久久久久电影网| 久久99精品久久久久子伦| 精品无码久久久久久久动漫| 亚洲国产香蕉人人爽成AV片久久| 亚洲精品美女久久777777| 久久国产精品国语对白| 99久久99久久精品免费看蜜桃| 亚洲国产精品成人AV无码久久综合影院 | 国产一区二区三区久久精品| 热RE99久久精品国产66热| 久久成人国产精品二三区| 亚洲狠狠婷婷综合久久蜜芽| 91亚洲国产成人久久精品网址| 久久天天躁狠狠躁夜夜网站| 青青草原综合久久大伊人导航| 情人伊人久久综合亚洲| 久久久久亚洲AV无码专区体验| 久久综合色老色| 久久WWW免费人成—看片| 久久久久国产精品| 国产精品久久久久AV福利动漫| 亚洲精品乱码久久久久66| 思思久久99热只有频精品66| 狠狠精品干练久久久无码中文字幕 | 久久99国内精品自在现线| A级毛片无码久久精品免费| 日韩久久久久中文字幕人妻| 久久精品三级视频| 久久精品国产一区二区三区| 国产成人无码精品久久久免费 | 97久久综合精品久久久综合| 久久久无码一区二区三区| 久久久噜噜噜久久中文福利| 日本人妻丰满熟妇久久久久久| 色欲av伊人久久大香线蕉影院|