ftp多线程下载工具

这篇具有很好参考价值的文章主要介绍了ftp多线程下载工具。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

//代码类似https多线程下载,整体实现逻辑类似,区别比较大的是curl_opt的相关参数设置不一样

#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; //处理下载进度 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);//设置头文件处理函数(获取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; } //各线程分别写自己对应的位置 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);//写文件函数 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);//下载进度显示函数 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; } //内存映射本地的文件(放置ftp服务器上需要下载的文件) 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; //创建THREADS_NUMS个线程,同时设置各线程在文件中的下载位置 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; }

 文章来源地址https://www.toymoban.com/news/detail-842768.html

到了这里,关于ftp多线程下载工具的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【工具】Github统计代码行数工具推荐(VScode插件、兼容任何平台、不用下载安装包)

    需求: 1)被要求统计代码行数; 2)不想打开Linux,懒得下载Windows版本GitStats; 3)打开了Linux但也不记得find命令行怎么用; 4)打开了Linux,装好了Gitstats但自己没有图形化界面所以无法打开其输出结果; 5)习惯用VScode编程。 其他工具: 1)Linux愿意使用Gitstats的请直接转到

    2024年02月05日
    浏览(43)
  • 【开源鸿蒙】下载 OpenHarmony 4.0 源代码和工具链

    本文介绍了如何下载开源鸿蒙(OpenHarmony)操作系统源码,该方法可以用于下载OpenHarmony最新开发版本(master分支)或者4.0 Release、3.2 Release等发布版本。 本文基于Ubuntu 22.04进行操作,Ubuntu其他版本也同样可行,包括 20.04, 18.04。 OpenHarmony架构图: 本节介绍如何准备命令行工具

    2024年04月13日
    浏览(62)
  • gitee 代码下载和git、TortoiseGit工具(附安装包)

            打开一个 gitee 的项目,点击下载后,会出现弹窗,直接点击下载zip,就可以下载全部的master(主线)代码,下载完的代码可以直接导入到工具中使用         gitee 私人令牌,是将本地代码提交到 gitee 的密码,需要提前申请         Usernam 就是账号:duomu-YS,    

    2024年03月21日
    浏览(39)
  • 分布式版本控制工具Git官网概述、下载安装和代码托管中心

    首先直接在百度搜索Git,点击官方 可以看到官方给的介绍是: Git是个免费的、开源的 分布式版本控制系统 ,可以快速高效地处理从小型到大型的各种项目。 Git 易于学习,占用面积小,性能极快。 它具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。其性能优于

    2024年01月20日
    浏览(44)
  • 《 STM32 ST-LINK Utility 》__代码下载工具下载、安装和使用说明(小白也能懂)

    目录 一、什么是STM32 ST-LINK Utility? 二、STM32 ST-LINK Utility有什么用? 三、官方途径下载软件! 四、我的资源 五、安装 六、怎么用? 1、比如我们经常使用的Keil是如何生成hex 2、读取STM32内部FLASH及芯片信息 3、打开hex程序 4、下载程序  (* ̄︶ ̄)创作不易!期待你们的 点赞、

    2024年02月06日
    浏览(41)
  • Codeium - 一款国内下载很慢注册不上的个人免费的AI代码补全工具

    下载地址:Codeium - VSCode扩展市场 等待下载 等吧,下载速度10KB/s 终于下载完了,下载了半个小时 VSCode左下角,点击帐户图标展开菜单 点击 使用 Codeium Auth 登录以使用 Codeium…… 点击 打开(O) 按钮打开Codeium官网 点击 Log in with Google ,Google ?连不上Google 谷什么歌 或者点击 Si

    2024年02月11日
    浏览(144)
  • Spring第三课,Lombok工具包下载,对应图书管理系统列表和登录界面的后端代码,分层思想

    目录 一、Lombok工具包下载 二、前后端互联的图书管理系统 规范  三、分层思想 三层架构: 1.表现层 2.业务逻辑层 3.数据层 这个工具包是为了做什么呢? 他是为了不去反复的设置setting and getting 而去产生的工具包 ⚠️工具包下载:推荐不要下载太新的(较高的),也不要太

    2024年02月05日
    浏览(29)
  • 使用OpenCV工具包成功实现人脸检测与人脸识别,包括传统视觉和深度学习方法(附完整代码,模型下载......)

    要实现人脸识别功能,首先要进行人脸检测,判断出图片中人脸的位置,才能进行下一步的操作。 参考链接: 1、OpenCV人脸检测 2、【OpenCV-Python】32.OpenCV的人脸检测和识别——人脸检测 3、【youcans 的图像处理学习课】23. 人脸检测:Haar 级联检测器 4、OpenCV实战5:LBP级联分类器

    2024年02月08日
    浏览(34)
  • https多线程下载代码

    这里使用了curl网络库和使用多线程来下载对应https链接的文件 对应的.h头文件: 其中, writeFile函数主要处理将服务器上的文件下载到本地上。对应CURLOPT_WRITEFUNCTION progress_callback函数用来计算下载进度。对应CURLOPT_PROGRESSFUNCTION sighandler_func函数处理ctrl+c后,存储当前的下载进度

    2024年03月23日
    浏览(23)
  • 中文编程工具免费版下载,中文开发语言工具免费版下载

    中文编程工具免费版下载,中文开发语言工具免费版下载 中文编程工具开发的实际部分案例如下图 编程系统化课程总目录及明细,点击进入了解详情。https://blog.csdn.net/qq_29129627/article/details/134073098?spm=1001.2014.3001.5502

    2024年02月08日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包