• <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>

            牽著老婆滿街逛

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

            使用libcurl實(shí)現(xiàn)的上傳器

            頭文件
            /**********************************************************************
            * Copyright (C) 2014 -  - All Rights Reserved
            *
            * 文件名稱:        Uploader_LibCurl.h
            * 摘    要:        上傳器 - LibCurl實(shí)現(xiàn)
            *     
            * 作    者:        yanglinbo,
            * 修    改:        查看文件最下方.

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


            #ifndef __Uploader_LibCurl_H__
            #define __Uploader_LibCurl_H__


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


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

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

                
            /// 啟動(dòng)上傳
                virtual bool start(const std::string& strUrl, const std::string& strLocalFile);

                
            /// 停止上傳
                virtual bool stop();

                
            /// 是否運(yùn)行狀態(tài)
                bool isRunning() const;

            protected:
                
            /// 讀取回調(diào)
                static size_t handleRead(void *buffer, size_t size, size_t nmemb, void *userp);

                
            /// 進(jìn)度回調(diào)
                static size_t handleProgress(void *buffer, double dltotal, double dlnow, double ultotal, double ulnow);

            protected:
                
            /// 讀取回調(diào)
                size_t onUpload(void *buffer, size_t size, size_t nmemb);

                
            /// 進(jìn)度回調(diào)
                size_t onProgress(const double& ultotal, const double& ulnow);

                
            /// 上傳回調(diào)
                void onUpload();

            protected:
                
            /// 設(shè)置libcurl選項(xiàng)
                bool setOption();

                
            /// 清除數(shù)據(jù)
                void clear();

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

                bool            m_bRunning;                ///< 運(yùn)行標(biāo)志

                std::string        m_strRemoteUrl;            ///< 遠(yuǎn)程鏈接
                std::string        m_strLocalFilePath;        ///< 本地文件路徑

                size_t            m_nLocalFileSize;        ///< 本地文件大小
            };



            #endif

            實(shí)現(xiàn)文件
            /**********************************************************************
            * Copyright (C) 2014 -  - All Rights Reserved
            *
            * 文件名稱:        Uploader_LibCurl.cpp
            * 摘    要:        上傳器 - LibCurl實(shí)現(xiàn)
            *     
            * 作    者:        yanglinbo,
            * 修    改:        查看文件最下方.

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


            #include 
            "StdAfx.h"
            #include 
            "Uploader.h"
            #include 
            <sys/stat.h>
            #include 
            <fcntl.h>


            CUploader::CUploader(
            void)
            : m_pCurl(NULL)
            , m_pFile(NULL)
            , m_bRunning(
            false)
            , m_nLocalFileSize(
            0)
            {
            }


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


            bool CUploader::run()
            {
                onUpload();
                
            return true;
            }


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


            void CUploader::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_strRemoteUrl.clear();
                m_strLocalFilePath.clear();

                m_nLocalFileSize 
            = 0;
            }


            bool CUploader::setOption()
            {
                
            // 遠(yuǎn)程URL,支持 http, https, ftp
                curl_easy_setopt(m_pCurl, CURLOPT_URL, m_strRemoteUrl.c_str());

                curl_easy_setopt(m_pCurl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)m_nLocalFileSize);

                
            // 設(shè)置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());

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

                
            // 設(shè)置301、302跳轉(zhuǎn)跟隨location
                curl_easy_setopt(m_pCurl, CURLOPT_FOLLOWLOCATION, 1);

                curl_easy_setopt(m_pCurl, CURLOPT_UPLOAD, TRUE);

                curl_easy_setopt(m_pCurl, CURLOPT_NOSIGNAL, 
            1L);
                curl_easy_setopt(m_pCurl, CURLOPT_POST, TRUE);
                curl_easy_setopt(m_pCurl, CURLOPT_FORBID_REUSE, TRUE);

                
            // 上傳內(nèi)容回調(diào)函數(shù)
                curl_easy_setopt(m_pCurl, CURLOPT_READFUNCTION, handleRead);
                curl_easy_setopt(m_pCurl, CURLOPT_READDATA, 
            this);

                
            // 進(jìn)度回調(diào)函數(shù)
                curl_easy_setopt(m_pCurl, CURLOPT_NOPROGRESS, 0);
                curl_easy_setopt(m_pCurl, CURLOPT_PROGRESSDATA, 
            this);
                curl_easy_setopt(m_pCurl, CURLOPT_PROGRESSFUNCTION, handleProgress);

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

                
            // 驗(yàn)證服務(wù)器端發(fā)送的證書,默認(rèn)是 2(高),1(中),0(禁用)
                curl_easy_setopt(m_pCurl, CURLOPT_SSL_VERIFYHOST, 0L);

                
            return true;
            }


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

                
            if (m_bRunning == truereturn true;

                clear();

                m_strRemoteUrl    
            = strUrl;
                m_strLocalFilePath    
            = strLocalFile;

                
            // 打開文件
                m_pFile = fopen(m_strLocalFilePath.c_str(), "rb");
                
            if (m_pFile == NULL)
                
            {
                    
            return false;
                }


                
            // 獲取文件大小
                struct stat file_info;
                
            if (fstat(fileno(m_pFile), &file_info) != 0
                
            {
                    
            return false;
                }

                m_nLocalFileSize 
            = file_info.st_size;

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


                
            // 設(shè)置libcurl的選項(xiàng)
                setOption();

                m_bRunning 
            = true;

                
            return true;
            }


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

                m_bRunning 
            = false;

                
            return true;
            }


            size_t CUploader::handleRead( 
            void *buffer, size_t size, size_t nmemb, void *userp )
            {
                CUploader
            * pDownloader = (CUploader*) userp;
                
            if (pDownloader)
                
            {
                    
            return pDownloader->onUpload(buffer, size, nmemb);
                }

                
            return 0;
            }


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

                
            return 0;
            }


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


            size_t CUploader::onUpload( 
            void *buffer, size_t size, size_t nmemb )
            {
                size_t return_size 
            = fread(buffer, size, nmemb, m_pFile);
                
            return return_size;
            }


            void CUploader::onUpload()
            {
                
            // 執(zhí)行上傳
                CURLcode return_code = CURLE_OK;
                return_code 
            = curl_easy_perform(m_pCurl);

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


                
            // 上傳失敗
                if (return_code != CURLE_OK)
                
            {
                    
            return;
                }


                
            // 獲取狀態(tài)碼
                int response_code = 0;
                curl_easy_getinfo(m_pCurl, CURLINFO_RESPONSE_CODE, 
            &response_code);
            }


            示例代碼:
            CUploader uploader
            uploader.start(
            "ftp://upload:upload@127.0.0.1/hello.exe""C:\\fly.exe");
            uploader.run();

            posted on 2014-04-01 23:23 楊粼波 閱讀(1244) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)編程C++

            久久97久久97精品免视看| 久久久久婷婷| 亚洲AV无码久久精品狠狠爱浪潮| 久久亚洲精品成人无码网站| 色8久久人人97超碰香蕉987| 国产欧美久久久精品| 久久中文精品无码中文字幕 | 久久久国产乱子伦精品作者| 久久国产精品99国产精| 久久久久国色AV免费观看| 久久精品aⅴ无码中文字字幕不卡 久久精品成人欧美大片 | av色综合久久天堂av色综合在 | 老男人久久青草av高清| 国产一级做a爰片久久毛片| 欧美精品一区二区久久| 久久香蕉超碰97国产精品| 久久国产精品一区| 97精品国产91久久久久久| 色综合久久无码中文字幕| 久久一区二区三区99| 久久亚洲高清观看| 久久A级毛片免费观看| 亚洲精品无码成人片久久| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 亚洲欧美日韩中文久久| 久久亚洲国产成人精品无码区| 久久久久国产一级毛片高清版| 亚洲伊人久久精品影院| 伊人久久大香线蕉av不变影院 | 国产精品成人精品久久久| 国产精品女同久久久久电影院| 久久久亚洲欧洲日产国码是AV | 久久国产免费观看精品3| 伊人久久综合无码成人网| 久久亚洲AV成人无码软件| 久久免费看黄a级毛片| 亚洲v国产v天堂a无码久久| 久久只这里是精品66| 狠狠色丁香婷婷久久综合| 久久婷婷国产剧情内射白浆| 少妇熟女久久综合网色欲|