2013-03-05 32 views
0

我试图使用libcurl 7.20.0和openssl 0.9.8l下载文件(但我将库更新为7.29.0和1.0.1e),Windows 7和其他所有软件正在为amd64编译下载一个大文件。我使用curlpp作为卷发的包装。问题是,一旦达到2GB,下载将停止,并出现错误Failed writing body (0 != 8999)。我使用的要求去做的代码是:libcurl + openssl无法下载大于2GB的文件

boost::shared_ptr<curlpp::Easy> curl_request(boost::make_shared<curlpp::Easy>()); 
curl_request.setOpt(new curlpp::options::HttpVersion(CURL_HTTP_VERSION_1_0)); 
curl_request.setOpt(new curlpp::options::Timeout(3600)); 
curl_request.setOpt(new curlpp::options::SslVerifyHost(0)); 
curl_request.setOpt(new curlpp::options::SslVerifyPeer(0)); 
curl_request->setOpt(new curlpp::options::Url(request_uri)); 
if (cookies.size() == 0) { 
    curl_request->setOpt(new curlpp::options::CookieList("dummy")); 
} else { 
    BOOST_FOREACH(const std::string &cookie, m_cookies) { 
     curl_request->setOpt(new curlpp::options::CookieList(cookie)); 
    } 
} 
curl_request->setOpt(new curlpp::options::Post(true)); 
curl_request->setOpt(new curlpp::options::PostFields(query_string)); 
curl_request->setOpt(new curlpp::options::WriteStream(stream.get())); 

try { 
    curl_request->perform(); 
} catch (std::exception &ex) { 
    error = true; 
    std::cerr << "caught Unknown error: " << ex.what() << std::endl; 
} 

编辑流是一个字符串流,我使用MS VS 2008

+0

什么操作系统?它是32位还是64位? – Raedwald 2013-03-05 12:47:45

+0

windows 64 bits – Sambatyon 2013-03-05 12:48:39

+0

您是否已将CURLOPT_VERBOSE和CURLOPT_HEADER设置为1以查看实际从服务器返回的内容?作为一个HTTP特定问题,2GB限制看起来非常熟悉(早在20世纪90年代,很多文件系统都有2GB的限制,所以我认为人们认为它是一个可接受的限制)。 – 2013-03-05 13:07:00

回答

1

这不是一个libcurl的或OpenSSL的限制。这是您的文件系统(FAT?)或WriteStream实现(或类似),以防止它的工作。

错误消息似乎意味着突然写入磁盘失败,这可能是写入溢出最大支持的大小。

+0

这可能很好。我正在写一个字符串流。 – Sambatyon 2013-03-05 14:27:52

+0

因此,在写入2GB后的字符串流时出现问题。我改变了潮流,一切正常。 – Sambatyon 2013-03-07 09:15:26