当URL不正确时,curl_easy_perform崩溃

时间:2012-10-31 14:32:41

标签: c++ multithreading curl libcurl

尝试使用libcurl下载文件时遇到问题。该程序适用于多个线程,每个需要下载文件的线程都会创建一个libcurl句柄来处理。

当URL正确时,一切正常,但如果URL中存在错误,则程序崩溃。在调试模式下,如果URL不正确curl_easy_perform返回错误连接代码并且程序正常工作。相比之下,它在发布时崩溃了。

我该如何解决此错误?

以下是我用来下载文件的代码,不相关的代码已经被压制了:

LoadFileFromServer
(
    string& a_sURL
)
{
    string  sErrorBuffer;

    struct DownloadedFile updateFile = { sFilenameToWrite,  // name to store the local file if succesful
                                         NULL };            // temp buffer

    CURL*   pCurl = curl_easy_init();

    curl_easy_setopt( pCurl, CURLOPT_URL, a_sURL.data() );
    curl_easy_setopt( pCurl, CURLOPT_FOLLOWLOCATION, 1L );
    curl_easy_setopt( pCurl, CURLOPT_ERRORBUFFER, sErrorBuffer );
    curl_easy_setopt( pCurl, CURLOPT_WRITEFUNCTION, BufferToFile );
    curl_easy_setopt( pCurl, CURLOPT_WRITEDATA, &updateFile );
    curl_easy_setopt( pCurl, CURLOPT_NOPROGRESS, 0 );
    curl_easy_setopt( pCurl, CURLOPT_CONNECTTIMEOUT, 5L );

    CURLcode res = curl_easy_perform( pCurl );

    curl_easy_cleanup( pCurl );
}

int BufferToFile
( 
    void *  a_buffer, 
    size_t  a_nSize, 
    size_t  a_nMemb, 
    void *  a_stream 
)
{
    struct DownloadedFile *out = ( struct DownloadedFile * ) a_stream;
    if( out && !out->stream ) 
    {
        // open file for writing 
        if ( 0 != fopen_s( &( out->stream ), out->filename.c_str(), "wb" ) )
            return -1;
        if( !out->stream )
            return -1; /* failure, can't open file to write */
    }

    return fwrite( a_buffer, a_nSize, a_nMemb, out->stream );
}

2 个答案:

答案 0 :(得分:0)

libcurl要求给定的URL是指向它可以读取的有效缓冲区的指针。如果不是,则错误在您的代码中。

如果你将一个正确的指针传递给一个(零终止的)字符串,那么该字符串可以是一个正确的URL,但是libcurl不会因为它而崩溃(据我所知它不会)。

答案 1 :(得分:-1)

首先,您可以检查提供它们的函数的所有返回代码,只是为了查看是否所有内容都按照您的假设运行。

其次,Curl是C,而不是C ++,它不会产生异常。

第三,如果您的C程序崩溃,那么所有代码​​都是相关的,C程序可能会以各种有趣的方式崩溃,并且实际原因与Curl无关,或者可能是。

你做了太多的假设。

迈克尔