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