尝试使用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 );
}
答案 0 :(得分:0)
libcurl要求给定的URL是指向它可以读取的有效缓冲区的指针。如果不是,则错误在您的代码中。
如果你将一个正确的指针传递给一个(零终止的)字符串,那么该字符串可以是一个正确的URL,但是libcurl不会因为它而崩溃(据我所知它不会)。
答案 1 :(得分:-1)
首先,您可以检查提供它们的函数的所有返回代码,只是为了查看是否所有内容都按照您的假设运行。
其次,Curl是C,而不是C ++,它不会产生异常。
第三,如果您的C程序崩溃,那么所有代码都是相关的,C程序可能会以各种有趣的方式崩溃,并且实际原因与Curl无关,或者可能是。
你做了太多的假设。
迈克尔