关于libcurl下载数据不全的bug

开始怎么也不知道是什么问题,google了半天,发现全没有一个对的.都快要放弃时,发现这上面的
http://www.rosoo.net/a/201202/15674.html,说了writedata时要返回字节数.
后来我不知怎么改的,好像又能正常了.
大致改掉了以下bug
1.stl的string在多线程下不安全导致的崩溃问题.
2.编译环境没设为多线程的崩溃问题.
3.404错误的异常问题.
4.设置超时时间.

不多说,上代码,那些注释都是bug.

FILE *fp = fopen(strFullName,"wb");
if (!fp){
	m_pLogger->log("Open File Error\n");
	if (strLocalDir)
		*strLocalDir = "";
	if (strLocalFileName)
		*strLocalFileName = "";
	return false;
}

#define MAX_CONN_TIMEOUT 20
#define MAX_TIMEOUT 1000
//from network download
CURL* pUrl = curl_easy_init();
curl_easy_setopt(pUrl, CURLOPT_URL, strUrl);
curl_easy_setopt(pUrl, CURLOPT_WRITEFUNCTION, ProcessData);
curl_easy_setopt(pUrl, CURLOPT_CONNECTTIMEOUT, MAX_CONN_TIMEOUT);
curl_easy_setopt(pUrl, CURLOPT_TIMEOUT, MAX_TIMEOUT);
//curl_easy_setopt(pUrl, CURLOPT_VERBOSE, 1L);//调试信息打开
curl_easy_setopt(pUrl, CURLOPT_NOPROGRESS, 1L);
curl_easy_setopt(pUrl, CURLOPT_WRITEDATA, fp);
curl_easy_setopt(pUrl, CURLOPT_NOSIGNAL, 1L);
curl_easy_setopt(pUrl, CURLOPT_TIMEOUT, 3);
CURLcode ret = curl_easy_perform(pUrl);

//判断获取响应的http地址是否存在,若存在则返回200,400以上则为不存在,一般不存在为404错误  
int retcode = 0;  
ret = curl_easy_getinfo(pUrl, CURLINFO_RESPONSE_CODE , &retcode);
if (ret==CURLE_OK && retcode == 200){
	double length;
	ret = curl_easy_getinfo(pUrl, CURLINFO_CONTENT_LENGTH_DOWNLOAD , &length); 
	fflush(fp);
	fseek(fp,0,SEEK_END);
	int nDown = ftell(fp);
    fclose(fp);
	curl_easy_cleanup(pUrl);
	
	if (strLocalDir)
		*strLocalDir = strFullDir;
	if (strLocalFileName)
		*strLocalFileName = strFullName;
		
	if (nDown!= (int)length){
		if(!DeleteFile(strFullName)){
			int jj = GetLastError();
			int kk = 0;
		}
		return false;
	}
	return true;
}
//在写文件回调里
size_t ProcessData(void *buffer, size_t size, size_t nmemb, void *user_p){
//sprintf((char*)user_p,"%s%s",user_p,buffer);
// memcpy(user_p,buffer,size*nmemb);
// user_p = (void *)((char*)user_p+size*nmemb);
fwrite(buffer,size,nmemb,(FILE*)user_p);
// fflush((FILE*)user_p);
    return size*nmemb; 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值