C++ LibCurl:curl\u multi\u在处理请求时执行不一致
我对libcurl很陌生。因此,我们非常感谢您的帮助 我正在尝试从CDN下载多个文件。总大小约为600mb。 这是我设置CURL句柄的代码片段(在名为“addTransfers()”的方法中)。(cm为CURLM*型) 这是我执行curl多进程的代码:C++ LibCurl:curl\u multi\u在处理请求时执行不一致,c++,libcurl,C++,Libcurl,我对libcurl很陌生。因此,我们非常感谢您的帮助 我正在尝试从CDN下载多个文件。总大小约为600mb。 这是我设置CURL句柄的代码片段(在名为“addTransfers()”的方法中)。(cm为CURLM*型) 这是我执行curl多进程的代码: bool do_multiple_downloads() { CURLM *cm; CURLMsg *msg; unsigned int transfers = 0; int pending = 1; in
bool do_multiple_downloads()
{
CURLM *cm;
CURLMsg *msg;
unsigned int transfers = 0;
int pending = 1;
int msg_pending = -1;
curl_global_init(CURL_GLOBAL_ALL);
cm = curl_multi_init();
curl_multi_setopt(cm, CURLMOPT_MAXCONNECTS, maxConnects);
for(transfers = 0; transfers < (int)maxConnects; transfers++)
{
if(!addTransfers(cm, transfers))
{
//Error
return false;
}
}
int i = 0;
do
{
/* code */
CURLMcode cPerformCode = curl_multi_perform(cm, &pending);
if(cPerformCode != CURLM_OK)
{
fprintf(stderr, "Error --> (%s) : Pending --> (%d)", curl_multi_strerror(cPerformCode), pending);
return false;
}
while((msg = curl_multi_info_read(cm, &msg_pending)))
{
if(msg != NULL)
{
if(msg->msg == CURLMSG_DONE)
{
FILE* writtenFile;
char* fname;
CURL *e = msg->easy_handle;
curl_easy_getinfo(e, CURLINFO_PRIVATE, &writtenFile);
fprintf(stderr, "R: %d - %s (%d)\n",
msg->data.result, curl_easy_strerror(msg->data.result), i++);
curl_multi_remove_handle(cm, e);
fclose(writtenFile);
curl_easy_cleanup(e);
}
else
{
fprintf(stderr, "E: CURLMsg (%d) : (%d)\n", msg->msg, i++);
}
if(transfers < totalSize)
{
if(!addTransfers(cm, transfers++))
{
//Error
fprintf(stderr, "Additional transfers addition\n");
return false;
}
}
}
}
if(pending)
{
curl_multi_wait(cm, NULL, 0, 1000, NULL);
}
} while (pending || (transfers < totalSize));
curl_multi_cleanup(cm);
curl_global_cleanup();
return true;
}
booldoou多次下载()
{
卷曲m*cm;
味精*味精;
无符号整数传输=0;
int pending=1;
int msg_pending=-1;
curl\u global\u init(curl\u global\u ALL);
cm=curl_multi_init();
curl_multi_setopt(cm、CURLMOPT_MAXCONNECTS、MAXCONNECTS);
对于(传输=0;传输<(int)MaxConnections;传输++)
{
如果(!添加传输(cm,传输))
{
//错误
返回false;
}
}
int i=0;
做
{
/*代码*/
CURLMcode cPerformCode=curl\u multi\u perform(cm,&pending);
如果(cPerformCode!=卷曲确定)
{
fprintf(stderr,“错误-->(%s):挂起-->(%d)”,curl\u multi\u strerror(cPerformCode),挂起);
返回false;
}
而((msg=curl\u multi\u info\u read(cm,&msg\u pending)))
{
如果(msg!=NULL)
{
如果(msg->msg==CURLMSG_DONE)
{
文件*可写文件;
char*fname;
CURL*e=msg->easy_handle;
curl\u easy\u getinfo(e、CURLINFO\u PRIVATE和writenfile);
fprintf(标准,“R:%d-%s(%d)\n”,
msg->data.result,curl\u easy\u strerror(msg->data.result),i++);
卷曲多柄(cm,e);
fclose(writenfile);
旋涡易于清理(e);
}
其他的
{
fprintf(stderr,“E:CURLMsg(%d):(%d)\n”,msg->msg,i++);
}
如果(传输<总大小)
{
如果(!addTransfers(cm,transfers++))
{
//错误
fprintf(stderr,“附加传输添加”);
返回false;
}
}
}
}
如果(待定)
{
curl\u multi\u wait(cm,NULL,0,1000,NULL);
}
}而(待定| |(传输<总大小));
卷曲多点清理(cm);
curl_global_cleanup();
返回true;
}
以下是场景:
bool do_multiple_downloads()
{
CURLM *cm;
CURLMsg *msg;
unsigned int transfers = 0;
int pending = 1;
int msg_pending = -1;
curl_global_init(CURL_GLOBAL_ALL);
cm = curl_multi_init();
curl_multi_setopt(cm, CURLMOPT_MAXCONNECTS, maxConnects);
for(transfers = 0; transfers < (int)maxConnects; transfers++)
{
if(!addTransfers(cm, transfers))
{
//Error
return false;
}
}
int i = 0;
do
{
/* code */
CURLMcode cPerformCode = curl_multi_perform(cm, &pending);
if(cPerformCode != CURLM_OK)
{
fprintf(stderr, "Error --> (%s) : Pending --> (%d)", curl_multi_strerror(cPerformCode), pending);
return false;
}
while((msg = curl_multi_info_read(cm, &msg_pending)))
{
if(msg != NULL)
{
if(msg->msg == CURLMSG_DONE)
{
FILE* writtenFile;
char* fname;
CURL *e = msg->easy_handle;
curl_easy_getinfo(e, CURLINFO_PRIVATE, &writtenFile);
fprintf(stderr, "R: %d - %s (%d)\n",
msg->data.result, curl_easy_strerror(msg->data.result), i++);
curl_multi_remove_handle(cm, e);
fclose(writtenFile);
curl_easy_cleanup(e);
}
else
{
fprintf(stderr, "E: CURLMsg (%d) : (%d)\n", msg->msg, i++);
}
if(transfers < totalSize)
{
if(!addTransfers(cm, transfers++))
{
//Error
fprintf(stderr, "Additional transfers addition\n");
return false;
}
}
}
}
if(pending)
{
curl_multi_wait(cm, NULL, 0, 1000, NULL);
}
} while (pending || (transfers < totalSize));
curl_multi_cleanup(cm);
curl_global_cleanup();
return true;
}