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

            天下

            記錄修行的印記

            [原創]封裝了個基于Libcurl的類,大家評評,盡情拍磚.

            [原創]封裝了個基于Libcurl的類,
            大家評評,盡情拍磚.
              1 #pragma once
              2 #include <iostream>
              3 #include <sys/types.h>
              4 #include <sys/stat.h>
              5 #include "curl/curl.h"
              6 #include "curl/types.h"
              7 #include "curl/easy.h"
              8 #pragma comment(lib, "curl/libcurl.lib");
              9 struct CURL_FtpFile {
             10   const char *filename;
             11   FILE *stream;
             12 };
             13 
             14 template<typename T>
             15 class CFtpClient{
             16 public:
             17     bool m_bDebug;
             18     char m_szFtpHost[1024];
             19     char m_szFtpUSERPWD[256];
             20     CFtpClient();
             21     bool close();
             22     bool open(char szFtpHost[],char szFtpUserName[],char szFtpPassword[],int nPort=21);
             23     bool GetFile(char szRemoteFileName[],char szLocalFileName[] ,T* pT=NULL);
             24     bool PutFile(char szLocalFileName[] ,char szRemoteFileName[],T* pT=NULL);
             25     bool RemoveFile(char szRemoteFileName[]);
             26     bool RemoveDir(char szRemoteDirectory[]);
             27 
             28     size_t GetLocalFileSize(char* szFileName);
             29 
             30 private:
             31     static size_t ReadLocalFileFunc (void *ptr, size_t size, size_t nmemb, void *stream);
             32     static size_t WriteLocalFileFunc(void *buffer, size_t size, size_t nmemb, void *stream);
             33     static int PutFileProgressFunc(void   *clientp,
             34                                     double dltotal,
             35                                     double dlnow,
             36                                     double ultotal, //上傳:總大小
             37                                     double ulnow    //上傳:當前大小
             38                                     );
             39 
             40     static int GetFileProgressFunc(void   *clientp,
             41                                     double dltotal,  //下載:當前大小
             42                                     double dlnow,    //下載:當前大小
             43                                     double ultotal,
             44                                     double ulnow);
             45 };
             46 
             47 
             48 template<typename T>
             49 CFtpClient<T>::CFtpClient(void):m_bDebug(false)
             50 {
             51 }
             52 
             53 template<typename T>
             54 bool CFtpClient<T>::open(char szFtpHost[],char szFtpUserName[],char szFtpPassword[],int nPort) {
             55     sprintf(m_szFtpHost,"ftp://%s:%d/",szFtpHost,nPort);
             56     sprintf(m_szFtpUSERPWD,"%s:%s",szFtpUserName,szFtpPassword);
             57     curl_global_init(CURL_GLOBAL_DEFAULT);
             58     return true;
             59 }
             60 
             61 template<typename T>
             62 bool CFtpClient<T>::close() {
             63     curl_global_cleanup();
             64     return true;
             65 }
             66 
             67 //FTP回調函數:讀
             68 template<typename T>
             69 size_t CFtpClient<T>::ReadLocalFileFunc(void *ptr, size_t size, size_t nmemb, void *stream) {
             70     return fread(ptr, size, nmemb, (FILE *)stream) * size;
             71 }
             72 
             73 //FTP回調函數:寫
             74 template<typename T>
             75 size_t CFtpClient<T>::WriteLocalFileFunc(void *buffer, size_t size, size_t nmemb, void *stream) {
             76     struct CURL_FtpFile *out=(struct CURL_FtpFile *)stream;
             77     if(out && !out->stream) {
             78         out->stream=fopen(out->filename, "wb");
             79         if(!out->stream)
             80             return -1; /* failure, can't open file to write */
             81     }
             82     return fwrite(buffer, size, nmemb, out->stream);
             83 }
             84 
             85 template<typename T>
             86 int CFtpClient<T>::PutFileProgressFunc(void  *clientp,
             87                                     double dltotal,
             88                                     double dlnow,
             89                                     double ultotal, //上傳:總大小
             90                                     double ulnow    //上傳:當前大小
             91                                     )
             92 {
             93     T *pT = (T*)clientp;
             94     return pT->uploading(ulnow,ultotal);
             95 }
             96 
             97 template<typename T>
             98 int CFtpClient<T>::GetFileProgressFunc(void *clientp,
             99                                     double dltotal,  //下載:總大小
            100                                     double dlnow,    //下載:當前大小
            101                                     double ultotal,
            102                                     double ulnow)
            103 
            104 {
            105     T *pT = (T*)clientp;
            106     return pT->downloading(dlnow,dltotal);
            107 }
            108 
            109 
            110 //獲取本地文件的大小
            111 template<typename T>
            112 size_t CFtpClient<T>::GetLocalFileSize(char* szFileName) {
            113     struct stat f_stat;
            114     if (stat(szFileName, &f_stat) == -1) {
            115         return -1;
            116     }
            117     return (size_t)f_stat.st_size;
            118 }
            119 
            120 template<typename T>
            121 bool CFtpClient<T>::GetFile(char szRemoteFileName[],char szLocalFileName[] ,T* pT) {
            122     CURL* curl;
            123     CURLcode res = CURL_LAST;
            124 
            125     curl = curl_easy_init();
            126     if (curl == NULL) {
            127         return false;
            128     }
            129     curl_easy_setopt(curl, CURLOPT_USERPWD, m_szFtpUSERPWD);
            130 
            131     //得到全路徑文件名
            132     char szRemoteFullPathFileName[1024];
            133     strcat(szRemoteFullPathFileName,m_szFtpHost);
            134     strcat(szRemoteFullPathFileName,szRemoteFileName);
            135 
            136     struct CURL_FtpFile ftpLocalFile={
            137         szLocalFileName,
            138         NULL
            139     };
            140 
            141     //設置遠程URL
            142     curl_easy_setopt(curl, CURLOPT_URL,szRemoteFullPathFileName);
            143 
            144     //設置回調函數
            145     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CFtpClient::WriteLocalFileFunc);
            146     curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpLocalFile);
            147     if (pT !=NULL){
            148         curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE);
            149         curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, CFtpClient::GetFileProgressFunc);
            150         curl_easy_setopt(curl, CURLOPT_PROGRESSDATA,pT);
            151     }
            152 
            153     res = curl_easy_perform(curl);
            154     curl_easy_cleanup(curl);
            155     if (ftpLocalFile.stream){
            156         fclose(ftpLocalFile.stream);
            157     }
            158     if (res != CURLE_OK){
            159         return false;
            160     }
            161     return true;
            162 }
            163 
            164 template<typename T>
            165 bool CFtpClient<T>::PutFile(char szLocalFileName[] ,char szRemoteFileName[],T* pT)
            166 {
            167     if (strlen(szLocalFileName)<1  || strlen(szRemoteFileName) <1) {
            168         return false;
            169     }
            170     CURL* curl;
            171     CURLcode res = CURL_LAST;
            172 
            173     curl = curl_easy_init();
            174     if (curl == NULL) {
            175         return false;
            176     }
            177     FILE* pLocalFile;
            178     pLocalFile = fopen(szLocalFileName,"rb");
            179     if (pLocalFile==NULL) {
            180         return false;
            181     }
            182     char szRemoteFullPathFileName[2048];
            183     memset(szRemoteFullPathFileName,'\0',2048);
            184     strcat(szRemoteFullPathFileName,m_szFtpHost);
            185     strcat(szRemoteFullPathFileName,szRemoteFileName);
            186 
            187     curl_easy_setopt(curl, CURLOPT_UPLOAD, 1);
            188     curl_easy_setopt(curl, CURLOPT_URL, szRemoteFullPathFileName);
            189     curl_easy_setopt(curl, CURLOPT_USERPWD,m_szFtpUSERPWD);
            190     curl_easy_setopt(curl, CURLOPT_READDATA, pLocalFile);
            191     curl_easy_setopt(curl, CURLOPT_READFUNCTION,CFtpClient::ReadLocalFileFunc);
            192     //curl_easy_setopt(curl, CURLOPT_INFILESIZE ,GetLocalFileSize(szLocalFullPathFileName));
            193     curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE,(curl_off_t)GetLocalFileSize(szLocalFileName));
            194     curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, 1);
            195     if (this->m_bDebug){
            196         curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
            197     }
            198 
            199     //設置進度處理
            200     if (pT !=NULL){
            201         curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE);
            202         curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, CFtpClient::PutFileProgressFunc);
            203         curl_easy_setopt(curl, CURLOPT_PROGRESSDATA,pT);
            204     }
            205     res = curl_easy_perform(curl);
            206     curl_easy_cleanup(curl);
            207     if (pLocalFile) {
            208         fclose(pLocalFile);
            209     }
            210     //用戶取消
            211     if (res == CURLE_ABORTED_BY_CALLBACK){
            212         this->RemoveFile(szRemoteFileName);
            213         return false;
            214     }
            215 
            216     if (res != CURLE_OK) {
            217         return false;
            218     }
            219     return true;
            220 }
            221 
            222 // 刪除文件
            223 template<typename T>
            224 bool CFtpClient<T>::RemoveFile(char szRemoteFileName[])
            225 {
            226     CURL* curl;
            227     CURLcode res = CURL_LAST;
            228     curl = curl_easy_init();
            229     if (curl == NULL) {
            230         return false;
            231     }
            232     struct curl_slist *headerlist=NULL;
            233     char szCmd[1024] = "DELE ";
            234 
            235     strcat(szCmd,szRemoteFileName);
            236 
            237     headerlist = curl_slist_append(headerlist, szCmd);
            238     curl_easy_setopt(curl, CURLOPT_URL,m_szFtpHost);
            239     curl_easy_setopt(curl, CURLOPT_POSTQUOTE, headerlist);
            240     curl_easy_setopt(curl, CURLOPT_USERPWD, m_szFtpUSERPWD);
            241     res = curl_easy_perform(curl);
            242     curl_easy_cleanup(curl);
            243     return (res == CURLE_OK);
            244 }
            245 
            246 // 刪除目錄
            247 template<typename T>
            248 bool CFtpClient<T>::RemoveDir(char szRemoteDirectory[])
            249 {
            250     CURL* curl;
            251     CURLcode res = CURL_LAST;
            252     curl = curl_easy_init();
            253     if (curl == NULL) {
            254         return false;
            255     }
            256     struct curl_slist *headerlist=NULL;
            257     char szCmd[1024] = "RMD ";
            258     strcat(szCmd,szRemoteDirectory);
            259     headerlist = curl_slist_append(headerlist, szCmd);
            260     curl_easy_setopt(curl, CURLOPT_URL,m_szFtpHost);
            261     curl_easy_setopt(curl, CURLOPT_POSTQUOTE, headerlist);
            262     curl_easy_setopt(curl, CURLOPT_USERPWD, m_szFtpUSERPWD);
            263     if (this->m_bDebug){
            264         curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, 1);
            265     }
            266     res = curl_easy_perform(curl);
            267     curl_easy_cleanup(curl);
            268     return (res == CURLE_OK);
            269 }
            270 


            posted on 2010-11-18 14:15 天下 閱讀(5293) 評論(6)  編輯 收藏 引用 所屬分類: C/C++Win32Socket

            評論

            # re: [原創]封裝了個基于Libcurl的類,大家評評,盡情拍磚. 2010-11-18 15:46 gaimor

            這是什么啊??  回復  更多評論   

            # re: [原創]封裝了個基于Libcurl的類,大家評評,盡情拍磚.[未登錄] 2010-11-18 16:31 我要去桂林


            多謝分享  回復  更多評論   

            # re: [原創]封裝了個基于Libcurl的類,大家評評,盡情拍磚. 2010-11-18 16:39 不宜過熱恩

            沒看明白,模板用在這里是和用途?  回復  更多評論   

            # re: [原創]封裝了個基于Libcurl的類,大家評評,盡情拍磚. 2010-11-18 17:32 天下

            @不宜過熱恩

            模板在這里的作用:
            比如:
            CXXXDialog中
            public:
            CFtpClient m_ftpClient<CXXXDialog>;

            m_ftpClient.PutFile(szLocalFileName,szRemoteFileName,this);

            //用于進度回調.
            CXXXDialog::uploading(double ulnow,double ultotal)
            {
            }

            見:
            bool CFtpClient<T>::PutFile(char szLocalFileName[] ,char szRemoteFileName[],T* pT)

            if (pT !=NULL){
            curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE);
            curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, CFtpClient::GetFileProgressFunc);
            curl_easy_setopt(curl, CURLOPT_PROGRESSDATA,pT);
            }  回復  更多評論   

            # re: [原創]封裝了個基于Libcurl的類,大家評評,盡情拍磚. 2010-11-18 17:33 天下

            @不宜過熱恩
            int CFileProgressDialog::uploading(double ulnow, double ultotal)
            {
            if (m_bIsCancel){
            return 1;
            }
            int nPercent = (int)(ulnow*100/ultotal);
            m_prsPercent.SetPos(nPercent);

            CString strText;
            strText.Format(_T("%d%%"),nPercent);
            GetDlgItem(IDC_STATIC_PERCENT)->SetWindowText(strText);
            return 0;
            }  回復  更多評論   

            # re: [原創]封裝了個基于Libcurl的類,大家評評,盡情拍磚. 2010-11-20 23:41 shaker(太子)

            如果僅僅是這樣的話 不應該被稱之為封裝libcurl吧?  回復  更多評論   

            <2010年10月>
            262728293012
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            導航

            統計

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評論

            人妻无码精品久久亚瑟影视 | 天天做夜夜做久久做狠狠| 亚洲精品美女久久777777| 一极黄色视频久久网站| 久久久久97国产精华液好用吗| 国产精品久久久久久一区二区三区| 无码人妻久久久一区二区三区 | 2022年国产精品久久久久| 久久亚洲私人国产精品| 色欲av伊人久久大香线蕉影院| 偷偷做久久久久网站| 一本色道久久88—综合亚洲精品| 久久国产精品无| 无码伊人66久久大杳蕉网站谷歌 | 久久青青草原亚洲av无码app| 亚洲av伊人久久综合密臀性色| 熟妇人妻久久中文字幕| 精品久久久久香蕉网| 久久福利青草精品资源站免费| 国产精品99久久久久久猫咪 | 伊人久久综在合线亚洲2019| 国内精品久久久久久久影视麻豆| 青青青青久久精品国产h| 久久久久国产精品嫩草影院 | 中文国产成人精品久久不卡| 亚洲色大成网站www久久九| 国产精品久久久久久| 久久综合给合综合久久| 久久久亚洲欧洲日产国码aⅴ| 精品久久777| 精品久久久久成人码免费动漫| 人妻无码中文久久久久专区| 国产精品无码久久四虎| 亚洲级αV无码毛片久久精品| 国产精品久久久久乳精品爆| 香蕉久久夜色精品国产尤物| 国产精品久久国产精麻豆99网站 | 精品久久久久成人码免费动漫| 精品久久久久久| 伊人久久大香线焦AV综合影院| 国产精品VIDEOSSEX久久发布|