libCurl 下载提速

1、变量声明

CURL *m_curlhandle;

2、资源初始化

curl_global_init(CURL_GLOBAL_ALL);
m_curlhandle = curl_easy_init();

3、文件数据写入回调函数

size_t writeFunc(void *ptr, size_t size, size_t nmemb, void *stream)
{
	std::cout << "--- write func ---" << std::endl;
	return fwrite(ptr, size, nmemb, (FILE*)stream);
}

4、主体核心部分

FILE *file;
CURLcode ret = CURLE_GOT_NOTHING;

file = fopen("D://10001.jpg", "ab+");

curl_easy_setopt(m_curlhandle, CURLOPT_URL, "ftp://192.168.5.3/10001.jpg");
curl_easy_setopt(m_curlhandle, CURLOPT_USERPWD, "root:password");

curl_easy_setopt(m_curlhandle, CURLOPT_WRITEFUNCTION, writeFunc);
curl_easy_setopt(m_curlhandle, CURLOPT_WRITEDATA, file);

ret = curl_easy_perform(m_curlhandle);
fclose(file);

int curl_state = 0;
if (ret != CURLE_OK)
{
	fprintf(stderr, "%s\n", curl_easy_strerror(ret));
}

5、资源释放

curl_easy_cleanup(m_curlhandle);
curl_global_cleanup();

通常如果我们下载文件都是按照1、2、3、4、5步骤这个顺序来设计,对于单个文件下载而言一点问题都没有。但是如果涉及到批量下载(比如服务器有成百上千个文件,每个文件都是几十兆),在不追求速度的情况下,这么来设计也是可以的,无非就是漫长的时间等待。如果追求速度,那么你会发现速度远不及FileZilla Client或IDM这种下载软件下载的速度快(千万别怀疑是lirCurl库的问题,凡事都先自己找找原因)。为了解决这个问题,我曾经纠结了1天时间,起初用文件分段下载方式,结果发现毫无作用。回过头来,细看代码其实不难发现,整个过程都是在与m_curlhandle变量打交道,于是乎把思路1、2、3、4、5...1、2、3、4、5......1、2、3、4、5这种逻辑变换成1、2、3、4、4...4、4、5,问题也就迎刃而解了。也就是说我们每次只需要变化第4步就可以了。不妨试试吧,祝您好运!

猜你喜欢

转载自blog.csdn.net/u012156872/article/details/118144237
今日推荐