国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ftp多線程下載工具

這篇具有很好參考價(jià)值的文章主要介紹了ftp多線程下載工具。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

//代碼類似https多線程下載,整體實(shí)現(xiàn)邏輯類似,區(qū)別比較大的是curl_opt的相關(guān)參數(shù)設(shè)置不一樣

#include <iostream> #include <fstream> #include <curl/curl.h> #include <pthread.h> #include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/types.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> using namespace std; #define THREADS_NUMS (10) class FileInfo { public: void * pFile; size_t offset; size_t endpos; char * pUrl; pthread_t tid; size_t used; FILE * file; size_t totalLen; }; FileInfo cFiles[THREADS_NUMS+1]; char buffer[64]={0}; long dwLen=0; //處理下載進(jìn)度 int progress_callback(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow){ if (dltotal != 0) { //printf("%lf / %lf (%lf %%)\n", dlnow, dltotal, dlnow*100.0 / dltotal); long totalUsedLen=0; //long totalLen=0; for(int i=0;i<THREADS_NUMS+1;i++) { totalUsedLen+=cFiles[i].used; totalUsedLen+=cFiles[i].totalLen; } printf("%ld / %ld (%ld %%)\n",totalUsedLen,dwLen,totalUsedLen*100/dwLen); } return 0; } //獲取ftp需要下載文件的大小 static size_t header_callback(char *buffer, size_t size, size_t nitems, void *userdata) { /* received header is nitems * size long in 'buffer' NOT ZERO TERMINATED */ /* 'userdata' is set with CURLOPT_HEADERDATA */ long duLen=0; if(sscanf(buffer,"Content-Length: %ld\n",&duLen)) { *(long *)userdata=duLen; } return nitems*size; } //獲取ftp需要下載文件的大小 double getFileLength(char * pUrl,char * usr,char * pwd) { CURL * pCurl=curl_easy_init(); if(NULL==pCurl) { cout<<"curl_easy_init error!"<<endl; return false; } snprintf(buffer,64,"%s:%s",usr,pwd); curl_easy_setopt(pCurl,CURLOPT_URL,pUrl); curl_easy_setopt(pCurl,CURLOPT_HEADER ,1); curl_easy_setopt(pCurl,CURLOPT_NOBODY ,1); curl_easy_setopt(pCurl,CURLOPT_USERPWD,buffer); curl_easy_setopt(pCurl, CURLOPT_HEADERFUNCTION, header_callback);//設(shè)置頭文件處理函數(shù)(獲取ftp需要下載的文件大小) curl_easy_setopt(pCurl, CURLOPT_HEADERDATA, &dwLen); CURLcode tRet=curl_easy_perform(pCurl); if(0!=tRet) { cout<<"curl_easy_perform error"<<endl; return false; } curl_easy_cleanup(pCurl); return dwLen; } //各線程分別寫自己對(duì)應(yīng)的位置 size_t writeFile(void *pData, size_t dwSize, size_t dwMemb, void * pFile) { FileInfo * pFileInfo=(FileInfo *)pFile; cout<<"id: "<<pFileInfo->tid<<" offset: "<<pFileInfo->offset<<endl; cout<<"dwSize*dwMemb: "<<dwSize*dwMemb<<endl; memcpy((char *)pFileInfo->pFile+pFileInfo->offset,(char *)pData,dwSize*dwMemb); pFileInfo->offset+=dwSize*dwMemb; pFileInfo->used+=dwSize*dwMemb; return dwSize*dwMemb; } void * works(void * arg) { FileInfo * pFile=(FileInfo *)arg; CURL * pCurl=curl_easy_init(); if(NULL==pCurl) { cout<<"curl_easy_init error!"<<endl; return NULL; } if(pFile->file) { cout<<"hello"<<endl; fscanf(pFile->file,"%ld-%ld-%ld",&pFile->offset,&pFile->endpos,&pFile->totalLen); } else { cout<<"downFile open failed"<<endl; } if(pFile->offset>=pFile->endpos-1) { cout<<pFile->tid<<" already downed: "<<pFile->offset<<"--"<<pFile->endpos<<endl; return NULL; } char range[64]={0}; snprintf(range,64,"%ld-%ld",pFile->offset,pFile->endpos); curl_easy_setopt(pCurl,CURLOPT_URL,"ftp://127.0.0.1/boost.rar");//需要下載的ftp文件鏈接 curl_easy_setopt(pCurl,CURLOPT_USERPWD,buffer); curl_easy_setopt(pCurl,CURLOPT_WRITEDATA,pFile->file); //CURLOPT_WRITEFUNCTION curl_easy_setopt(pCurl,CURLOPT_WRITEFUNCTION,writeFile);//寫文件函數(shù) curl_easy_setopt(pCurl,CURLOPT_WRITEDATA ,pFile); curl_easy_setopt(pCurl,CURLOPT_RANGE ,range); curl_easy_setopt(pCurl,CURLOPT_NOPROGRESS ,0L); curl_easy_setopt(pCurl,CURLOPT_PROGRESSFUNCTION,progress_callback);//下載進(jìn)度顯示函數(shù) CURLcode tRet=curl_easy_perform(pCurl); if(0!=tRet) { cout<<"curl_easy_perform error"<<endl; return NULL; } curl_easy_cleanup(pCurl); } void downFtpFile(char * usr,char * pwd) { long lLen=(long)getFileLength("ftp://127.0.0.1/boost.rar",usr,pwd); cout<<lLen<<endl; int fd=open("ftpdown.txt",O_RDWR|O_CREAT,S_IRUSR|S_IWUSR); if(fd==-1) { cout<<"open failed"<<endl; return; } if(lseek(fd,dwLen,SEEK_SET)==-1) { cout<<"lseek failed"<<endl; close(fd); return; } if(write(fd,"",1)!=1) { cout<<"write failed"<<endl; close(fd); return; } //內(nèi)存映射本地的文件(放置ftp服務(wù)器上需要下載的文件) char * filePos=(char *)mmap(NULL,dwLen,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); if(filePos==MAP_FAILED) { close(fd); cout<<"mmap failed: "<<errno<<endl; return; } int slice=dwLen/THREADS_NUMS; FILE * file=fopen("downTemp.txt","w+"); //FILE * file=NULL; //創(chuàng)建THREADS_NUMS個(gè)線程,同時(shí)設(shè)置各線程在文件中的下載位置 for(int i=0;i<THREADS_NUMS+1;i++) { cFiles[i].offset=i*slice; //cFiles[i].pUrl=pUrl; cFiles[i].pFile=filePos; //cFiles[i].used=0; cFiles[i].file=file; if(i==THREADS_NUMS) { cFiles[i].endpos=dwLen-1; cFiles[i].totalLen=cFiles[i].endpos-cFiles[i].offset+1; } else { cFiles[i].endpos=(i+1)*slice-1; cFiles[i].totalLen=slice; } pthread_create(&cFiles[i].tid,NULL,works,&cFiles[i]); usleep(1); } for(int i=0;i<THREADS_NUMS+1;i++) { cout<<"tid: "<<cFiles[i].tid<<" finished"<<endl; pthread_join(cFiles[i].tid,NULL); } cout<<"00000"<<endl; fclose(file); cout<<"11111"<<endl; munmap(filePos,dwLen); cout<<"22222"<<endl; } void sighandler_func(int arg) { cout<<"arg: "<<arg<<endl; int fd=open("downTemp.txt",O_RDWR|O_CREAT,S_IRUSR|S_IWUSR); for(int i=0;i<THREADS_NUMS+1;i++) { cFiles[i].totalLen=cFiles[i].used; //cout<<"used: "<<cFiles[i].used<<"/"<<cFiles[i].totalLen<<endl; char buffer[64]={0}; snprintf(buffer,64,"%ld-%ld-%ld\n",cFiles[i].offset,cFiles[i].endpos,cFiles[i].totalLen); write(fd,buffer,strlen(buffer)); } close(fd); exit(-1); } int main(int argc,char * * argv) { if(SIG_ERR==signal(SIGINT,sighandler_func)) { cout<<"signal error"<<endl; return 0; } downFtpFile(argv[1],argv[2]); cout<<"end"<<endl; return 0; }

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-842768.html

到了這里,關(guān)于ftp多線程下載工具的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【工具】Github統(tǒng)計(jì)代碼行數(shù)工具推薦(VScode插件、兼容任何平臺(tái)、不用下載安裝包)

    【工具】Github統(tǒng)計(jì)代碼行數(shù)工具推薦(VScode插件、兼容任何平臺(tái)、不用下載安裝包)

    需求: 1)被要求統(tǒng)計(jì)代碼行數(shù); 2)不想打開Linux,懶得下載Windows版本GitStats; 3)打開了Linux但也不記得find命令行怎么用; 4)打開了Linux,裝好了Gitstats但自己沒有圖形化界面所以無(wú)法打開其輸出結(jié)果; 5)習(xí)慣用VScode編程。 其他工具: 1)Linux愿意使用Gitstats的請(qǐng)直接轉(zhuǎn)到

    2024年02月05日
    瀏覽(34)
  • 【開源鴻蒙】下載 OpenHarmony 4.0 源代碼和工具鏈

    【開源鴻蒙】下載 OpenHarmony 4.0 源代碼和工具鏈

    本文介紹了如何下載開源鴻蒙(OpenHarmony)操作系統(tǒng)源碼,該方法可以用于下載OpenHarmony最新開發(fā)版本(master分支)或者4.0 Release、3.2 Release等發(fā)布版本。 本文基于Ubuntu 22.04進(jìn)行操作,Ubuntu其他版本也同樣可行,包括 20.04, 18.04。 OpenHarmony架構(gòu)圖: 本節(jié)介紹如何準(zhǔn)備命令行工具

    2024年04月13日
    瀏覽(37)
  • gitee 代碼下載和git、TortoiseGit工具(附安裝包)

    gitee 代碼下載和git、TortoiseGit工具(附安裝包)

    ? ? ? ? 打開一個(gè) gitee 的項(xiàng)目,點(diǎn)擊下載后,會(huì)出現(xiàn)彈窗,直接點(diǎn)擊下載zip,就可以下載全部的master(主線)代碼,下載完的代碼可以直接導(dǎo)入到工具中使用 ? ? ? ? gitee 私人令牌,是將本地代碼提交到 gitee 的密碼,需要提前申請(qǐng) ????????Usernam 就是賬號(hào):duomu-YS, ???

    2024年03月21日
    瀏覽(28)
  • 分布式版本控制工具Git官網(wǎng)概述、下載安裝和代碼托管中心

    分布式版本控制工具Git官網(wǎng)概述、下載安裝和代碼托管中心

    首先直接在百度搜索Git,點(diǎn)擊官方 可以看到官方給的介紹是: Git是個(gè)免費(fèi)的、開源的 分布式版本控制系統(tǒng) ,可以快速高效地處理從小型到大型的各種項(xiàng)目。 Git 易于學(xué)習(xí),占用面積小,性能極快。 它具有廉價(jià)的本地庫(kù),方便的暫存區(qū)域和多個(gè)工作流分支等特性。其性能優(yōu)于

    2024年01月20日
    瀏覽(104)
  • 《 STM32 ST-LINK Utility 》__代碼下載工具下載、安裝和使用說明(小白也能懂)

    目錄 一、什么是STM32 ST-LINK Utility? 二、STM32 ST-LINK Utility有什么用? 三、官方途徑下載軟件! 四、我的資源 五、安裝 六、怎么用? 1、比如我們經(jīng)常使用的Keil是如何生成hex 2、讀取STM32內(nèi)部FLASH及芯片信息 3、打開hex程序 4、下載程序? (* ̄︶ ̄)創(chuàng)作不易!期待你們的 點(diǎn)贊、

    2024年02月06日
    瀏覽(24)
  • Codeium - 一款國(guó)內(nèi)下載很慢注冊(cè)不上的個(gè)人免費(fèi)的AI代碼補(bǔ)全工具

    Codeium - 一款國(guó)內(nèi)下載很慢注冊(cè)不上的個(gè)人免費(fèi)的AI代碼補(bǔ)全工具

    下載地址:Codeium - VSCode擴(kuò)展市場(chǎng) 等待下載 等吧,下載速度10KB/s 終于下載完了,下載了半個(gè)小時(shí) VSCode左下角,點(diǎn)擊帳戶圖標(biāo)展開菜單 點(diǎn)擊 使用 Codeium Auth 登錄以使用 Codeium…… 點(diǎn)擊 打開(O) 按鈕打開Codeium官網(wǎng) 點(diǎn)擊 Log in with Google ,Google ?連不上Google 谷什么歌 或者點(diǎn)擊 Si

    2024年02月11日
    瀏覽(46)
  • Spring第三課,Lombok工具包下載,對(duì)應(yīng)圖書管理系統(tǒng)列表和登錄界面的后端代碼,分層思想

    Spring第三課,Lombok工具包下載,對(duì)應(yīng)圖書管理系統(tǒng)列表和登錄界面的后端代碼,分層思想

    目錄 一、Lombok工具包下載 二、前后端互聯(lián)的圖書管理系統(tǒng) 規(guī)范 ?三、分層思想 三層架構(gòu): 1.表現(xiàn)層 2.業(yè)務(wù)邏輯層 3.數(shù)據(jù)層 這個(gè)工具包是為了做什么呢? 他是為了不去反復(fù)的設(shè)置setting and getting 而去產(chǎn)生的工具包 ??工具包下載:推薦不要下載太新的(較高的),也不要太

    2024年02月05日
    瀏覽(18)
  • 使用OpenCV工具包成功實(shí)現(xiàn)人臉檢測(cè)與人臉識(shí)別,包括傳統(tǒng)視覺和深度學(xué)習(xí)方法(附完整代碼,模型下載......)

    使用OpenCV工具包成功實(shí)現(xiàn)人臉檢測(cè)與人臉識(shí)別,包括傳統(tǒng)視覺和深度學(xué)習(xí)方法(附完整代碼,模型下載......)

    要實(shí)現(xiàn)人臉識(shí)別功能,首先要進(jìn)行人臉檢測(cè),判斷出圖片中人臉的位置,才能進(jìn)行下一步的操作。 參考鏈接: 1、OpenCV人臉檢測(cè) 2、【OpenCV-Python】32.OpenCV的人臉檢測(cè)和識(shí)別——人臉檢測(cè) 3、【youcans 的圖像處理學(xué)習(xí)課】23. 人臉檢測(cè):Haar 級(jí)聯(lián)檢測(cè)器 4、OpenCV實(shí)戰(zhàn)5:LBP級(jí)聯(lián)分類器

    2024年02月08日
    瀏覽(29)
  • https多線程下載代碼

    這里使用了curl網(wǎng)絡(luò)庫(kù)和使用多線程來(lái)下載對(duì)應(yīng)https鏈接的文件 對(duì)應(yīng)的.h頭文件: 其中, writeFile函數(shù)主要處理將服務(wù)器上的文件下載到本地上。對(duì)應(yīng)CURLOPT_WRITEFUNCTION progress_callback函數(shù)用來(lái)計(jì)算下載進(jìn)度。對(duì)應(yīng)CURLOPT_PROGRESSFUNCTION sighandler_func函數(shù)處理ctrl+c后,存儲(chǔ)當(dāng)前的下載進(jìn)度

    2024年03月23日
    瀏覽(10)
  • 中文編程工具免費(fèi)版下載,中文開發(fā)語(yǔ)言工具免費(fèi)版下載

    中文編程工具免費(fèi)版下載,中文開發(fā)語(yǔ)言工具免費(fèi)版下載

    中文編程工具免費(fèi)版下載,中文開發(fā)語(yǔ)言工具免費(fèi)版下載 中文編程工具開發(fā)的實(shí)際部分案例如下圖 編程系統(tǒng)化課程總目錄及明細(xì),點(diǎn)擊進(jìn)入了解詳情。https://blog.csdn.net/qq_29129627/article/details/134073098?spm=1001.2014.3001.5502

    2024年02月08日
    瀏覽(102)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包