最近需要在项目中使用c++的下载,挑选了curl这个开源的库来处理下载的,本人英语是相当的差,使用的平台又是windows下面的,所以记录一下,也为其他需要的朋友避免走弯路。
1.库的编译问题,如果你选择官网下载最新的版本,那么你编译的时候还需要去下载openssl的源码,还有zlib,ssh2等一些东西,这些网上都有很多的方法解决,我去下载过最新的,折腾了一天,勉强算成功了。最后我在另外一个朋友的博客上面下载了一个curl-7.26.0的版本,这个版本可以直接编译,省去了很多麻烦和时间。(如果你有时间,你可以去下载最新的版本,然后好好编译,这对你自己还是很有帮助的)
2.官网确实有文档和例子,但是我英语比较差,所以看起来很吃力,基本都是在调试摸索的,还有例子基本是基于c的,我需要整理成c++的。(英文真的很重要)
3.多线程的问题还有就是暂停和停止下载的问题,网上很多源码都有下载的例子,但是关于暂停和取消下载的比较少,可能这个太容易了吧,但是对我来说不容易,我折腾了几天。
下面是我简单封装好的c++的使用curl下载的类,代码不是很复杂,直接添加到项目再把库文件设置好就可以直接使用,为了调用方便,使用的FastDelegate这个来替代回调函数。(公司有加密,使用代码只能以文本添加)
接下来是源码 curlFactory.h 头文件 这个类主要是提供构造和销毁下载类,并且初始化全局curl。
#pragma once
#ifdef WIN32
#include<iostream>
#include<windows.h>
#endif
#define CURL_STATICLIB
#include "curl/curl.h"
#ifdef _DEBUG
#pragma comment(lib, "./curlExtend/curl/libcurld.lib")
#else
#pragma comment(lib, "./curlExtend/curl/libcurl.lib")
#endif
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "wldap32.lib")
#include "curlDownload.h"
class locker
{
public:
inline locker() { m_hMutex=CreateMutex(NULL,FALSE,NULL); printf("Locker::Locker() ") ;}
inline ~locker() { CloseHandle(m_hMutex); }
inline void lock() { WaitForSingleObject(m_hMutex, INFINITE); }
inline void unlock() { ReleaseMutex(m_hMutex); }
private:
HANDLE m_hMutex;
};
class curlFactory
{
public:
static curlFactory* getInstance();
static void destroyInstance();
curlDownload *newcurlDownload(std::string url,std::string savepath);
curlDownload *newcurlDownload();
void delcurlDownload(curlDownload *& pObj);
protected:
curlFactory(void);
~curlFactory(void);
private:
static curlFactory* m_instance;
};
//
下面是curlFactory.cpp
#include "curlFactory.h"
locker llock;
curlFactory* curlFactory::m_instance = NULL
curlFactory::curlFactory(void)
{
}
curlFactory::~curlFactory(void)
{
}
curlFactory* curlFactory::getInstance()
{
if(NULL == m_instance)
{
llock.lock();
if(NULL == m_instance)
{
m_instance = new curlFactory();
curl_global_init(CURL_GLOBAL_ALL); // 避免多线程的时候出错
}
llock.unlock();
}
return m_instance;
}
void curlFactory::destroyInstance()
{
if (m_instance)
{
curl_global_cleanup();
delete m_instance;
m_instance = NULL;
}
}
curlDownload * curlFactory::newcurlDownload(std::string url,std::string savepath)
{
curl