资源简介
基于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
- 上一篇:各种USB封装,官方版本
- 下一篇:计算机组成原理实验报告8份
评论
共有 条评论