C++ LibCurl:curl\u multi\u在处理请求时执行不一致

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

我对libcurl很陌生。因此,我们非常感谢您的帮助

我正在尝试从CDN下载多个文件。总大小约为600mb。 这是我设置CURL句柄的代码片段(在名为“addTransfers()”的方法中)。(cm为CURLM*型)

这是我执行curl多进程的代码:

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;
}
以下是场景:

  • 有时它工作正常,所有文件都被下载-没问题
  • 有时下载已完成,但程序仍在do while循环中(挂起变量永远不会变为零)
  • 如果在进程发生时断开与internet的连接,程序将停留在do while循环中。当我重新连接到internet时,会出现场景2
  • 我是不是遗漏了什么??我可能在这里做了些傻事。不过我不确定。 提前谢谢

    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;
    }