• 大小: 17KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-01
  • 语言: 其他
  • 标签: curl下载  

资源简介

基于libcurl/pthreads的多线程下载器,支持暂停、还原、中止,断点续传,支持HTTP,HTTPS协议链接,经过上千万级别的下载量测试,测试成功率99.5%,http://blog.csdn.net/u012532305/article/details/46709495也是这篇文章的源码 参考后,移植到了 linux平台

资源截图

代码片段和文件信息


#include 
#include 
#include 
#include 
#include 
#include 
#include “CurlDownloader.h“

//下载临时文件后缀
#define DOWNLOAD_TMP_FILE_EXT “.dltmp“
//检测是否支持多线程分片传输的字符串
#define RANGE_TEST_FLAG “RangeTest“
//用于检测是否支持多线程下载接收大小
#define RANGE_TEST_RECV_SIZE 1024

CURLSH* CurlDownloader::sharedns_handle = NULL; 
CurlDownConfig CurlDownloader::g_curlDownCfg;

//线程信息
typedef struct _tThreadInfo{
unsigned long ulBegPos;  //下载起始位置
unsigned long ulBlockSize; //本线程负责下载的数据大小
unsigned long ulRecvSize; //本线程已经接收到的数据大小
CURL* pCurl;
pthread_t thrdId;
int iTryTimes;  //失败已经重试次数

_tThreadInfo() // 默认构造函数
{
ulBegPos = 0;
ulBlockSize = 0;
ulRecvSize = 0;
pCurl = NULL;
// thrdId.p = NULL;
// thrdId.x = 0;
thrdId = 0;
iTryTimes = 0;
}

}ThreadInfo;

void myprint(const std::string& strLog)
{
printf(“%s\n“ strLog.c_str());
}

void FFlushEx(FILE* stream)
{
int duphandle;
fflush(stream);
duphandle = dup(fileno(stream));
close(duphandle);
}

void ReplaceStr(std::string &src const std::string &target const std::string &replacement)
{
if (target == replacement)
{
return;
}

std::string::size_type startpos = 0;  
while (startpos != std::string::npos)  
{
startpos = src.find(target startpos);      
if(startpos != std::string::npos)  
{
src.replace(startpos target.length() replacement); 
startpos += replacement.length();
}
}
}

void SplitStr(const std::string& s const std::string &delim std::vector *ret) 
{  
if (!ret) 
{
return;
}
ret->clear();
size_t last = 0;  
size_t index=s.find_first_of(delimlast);  
while (index!=std::string::npos)  
{  
ret->push_back(s.substr(lastindex-last));  
last=index+delim.length();  
index=s.find_first_of(delimlast);  
}  

if (index-last>0)  
{  
ret->push_back(s.substr(lastindex-last));  
}  
}  

static bool checkConnect(const char *dst int cnt)   
{   
FILE *stream;       
char recvBuf[16] = {0};       
char cmdBuf[256] = {0};         
if (NULL == dst || cnt <= 0)       
{
return false;   
}

sprintf(cmdBuf “ping %s -c %d -i 0.2 | grep time= | wc -l“ dst cnt);       
stream = popen(cmdBuf “r“);       
fread(recvBuf sizeof(char) sizeof(recvBuf)-1 stream);      
pclose(stream);  
if (atoi(recvBuf) > 0)
{
return true;   
}

return false;
}   

unsigned long GetTickCount()
{
    struct timespec ts;

    clock_gettime(CLOCK_MONOTONIC &ts);

    return (ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
}

/** 
 * 功能:拷贝文件函数 
 * 参数: 
 *      sourceFileNameWithPath:源文件名(带路径) 
 *      targetFileNameWithPath:目标文件名(带路径) 
 * 返回值: 
 *      true: 拷贝成功 
 *      false:拷贝失败 
 * author:wangchangshuai jlu 
 */  
static bool copyFile(const char *sourceFileNameWithPath const char *targetFileNameWithPath)  
{  
    FILE *fpR *fpW;  
    char bu

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2016-03-08 18:00  include\
     文件        4709  2016-03-16 19:34  include\CurlDownloader.h
     目录           0  2016-03-08 18:00  src\
     文件       54534  2016-03-17 11:21  src\CurlDownloader.cpp
     文件        1350  2016-03-17 11:24  src\main.cpp
     文件         674  2016-03-14 15:10  Makefile

评论

共有 条评论