【问题标题】:curl_easy_perform crashes when the URL is not correct当 URL 不正确时 curl_easy_perform 崩溃
【发布时间】:2012-10-31 14:32:41
【问题描述】:

我在尝试使用 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 );
}

【问题讨论】:

  • 您能否编辑问题以包含错误的 URL?
  • 它是如何崩溃的?它是段错误还是您尝试查看它是否引发异常?您是否尝试过通过调试器运行?
  • LoadFileFromServer 是如何被调用的?这个函数的参数,一个字符串引用,是否在各个线程之间共享?
  • URL 不正确,因为主机名无效。
  • 我尝试在代码中引入 try/catch,但它还是崩溃了,没有异常可以捕获。在调试中它工作正常,curl_easy_perform 返回错误连接代码。

标签: c++ multithreading curl libcurl


【解决方案1】:

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

如果您将正确的指针传递给(以零结尾的)字符串,则该字符串可以是正确的 URL,但 libcurl 不应因此而崩溃(据我所知,它不会崩溃)。

【讨论】:

    【解决方案2】:

    首先,您可以检查提供它们的函数的所有返回码,看看是否一切正常。

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

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

    你做了太多的假设。

    迈克尔

    【讨论】:

      猜你喜欢
      • 2022-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 2021-08-04
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      相关资源
      最近更新 更多