微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用c++ libcurlcurl_multi_perform上传多个文件时如何调用fclose?

如何解决使用c++ libcurlcurl_multi_perform上传多个文件时如何调用fclose?

我设法使用 curl_multi_perform 上传了 8 GB 的数据,以上传保存在磁盘上的许多文件。问题是,我使用下面的代码 -

main()
{
 curl_multi_setopt(cm,CURLMOPT_MAXCONNECTS,(long)MAX_ParaLLEL);

        for(transfers = 0; transfers < MAX_ParaLLEL; transfers++)
                add_transfer(cm,files[transfers]);
   do  
        {   
                curl_multi_perform(cm,&still_alive);

                while((msg = curl_multi_info_read(cm,&msgs_left))) 
                {   
                        if(msg->msg == CURLMSG_DONE) 
                        {   
                                char *url;
                                CURL *e = msg->easy_handle;
                                curl_easy_getinfo(msg->easy_handle,CURLINFO_PRIVATE,&url);
                                
                                fprintf(stderr,"R: %d - %s <%s>\n",msg->data.result,curl_easy_strerror(msg->data.result),url);
                                curl_multi_remove_handle(cm,e); 
                                curl_easy_cleanup(e);
                        }
                        else
                        {
                                fprintf(stderr,"E: CURLMsg (%d)\n",msg->msg);
                        }
                        if(transfers < files.size())
                                add_transfer(cm,files[transfers++] );
                }
                if(still_alive)
                        curl_multi_wait(cm,NULL,1000,NULL);

        }

}
add_transfer()
{
  FILE *fp;
  fp  = fopen(filename.c_str(),"rb"); //filename changes as 1,2,3 for each call
   curl_easy_setopt(curlHandle,CURLOPT_UPLOAD,1L);
   curl_easy_setopt(curlHandle,CURLOPT_URL,strUrl.c_str());
  curl_easy_setopt(curlHandle,CURLOPT_READFUNCTION,NULL);
    curl_easy_setopt(curlHandle,CURLOPT_READDATA,fp);
 curl_easy_setopt(curlHandle,CURLOPT_INFILESIZE_LARGE,(curl_off_t)file_info.st_size);
 curl_multi_add_handle(cm,curlHandle);
}

现在的问题是文件指针没有关闭。使用上面的代码,我可以上传 1000 个文件,但如果我想上传 2000 个文件,我得到分段错误可能是因为在内存中打开了太多文件句柄而没有关闭。但是如果我尝试使用 fclose() 关闭 -

add_transfer()
{
...
...
 curl_multi_add_handle(cm,curlHandle);
fclose(fp);
}

当我调用 fclose 时我崩溃了。

请帮我解决这个问题,非常感谢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。