C++ 知道libcurl是否完成下载文件的可靠方法是什么?

C++ 知道libcurl是否完成下载文件的可靠方法是什么?,c++,libcurl,C++,Libcurl,我写了这个基本的课程: class SteamHTTP { public: SteamHTTP(); virtual ~SteamHTTP(); void DownloadAllGames(const wxString& username, wxGauge* progress); private: CURL* m_curl; std::stringstream m_currentRequestString; private: sta

我写了这个基本的课程:

class SteamHTTP
{
public:
    SteamHTTP();
    virtual  ~SteamHTTP();

    void DownloadAllGames(const wxString& username, wxGauge* progress);

private:
    CURL* m_curl;
    std::stringstream m_currentRequestString;

private:
    static size_t write_func(char *ptr, size_t size, size_t nmemb, void *userdata);
    static int progress_func(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow);
};


SteamHTTP::SteamHTTP()
{
    m_curl = curl_easy_init();
}

SteamHTTP::~SteamHTTP()
{
    curl_easy_cleanup(m_curl);
}

size_t SteamHTTP::write_func(char *data, size_t size, size_t nmemb, void *userdata)
{
    SteamHTTP* ptr = reinterpret_cast<SteamHTTP*>(userdata);
    ptr->m_currentRequestString << data;
    return size*nmemb;
}

int SteamHTTP::progress_func(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow)
{
    wxGauge* ptr = reinterpret_cast<wxGauge*>(clientp);
    ptr->SetValue(dlnow * 100.0f / dlnow );
    return 0;
}

void SteamHTTP::DownloadAllGames(const wxString& username, wxGauge* gauge)
{
    std::string url;
    CURLcode result;

    // Build URL
    url = std::string("http://steamcommunity.com/id/") + username.mbc_str() + std::string("/games?tab=all&xml=1");

    // Set URL
    curl_easy_setopt(m_curl, CURLOPT_URL, url.c_str());

    // Follow redirection
    curl_easy_setopt(m_curl, CURLOPT_FOLLOWLOCATION, 1);

    // Data Callback
    curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, SteamHTTP::write_func);
    curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, this);

    // Progress Callback
    curl_easy_setopt(m_curl, CURLOPT_PROGRESSFUNCTION, SteamHTTP::progress_func);
    curl_easy_setopt(m_curl, CURLOPT_PROGRESSDATA, gauge);
    curl_easy_setopt(m_curl, CURLOPT_NOPROGRESS, FALSE);

    // Perform
    result = curl_easy_perform(m_curl);
    if (result != 0){
        wxMessageBox(curl_easy_strerror(result), wxMessageBoxCaptionStr, wxICON_ERROR|wxOK);
    }
}
class-http
{
公众:
streamhttp();
虚拟~streamhttp();
void下载所有游戏(const wxString&username,wxGauge*进度);
私人:
旋度*m_旋度;
std::stringstream m_currentRequestString;
私人:
静态大小写入函数(char*ptr、size\t size、size\t nmemb、void*userdata);
静态整数进度函数(void*clientp,double-dltotal,double-dlnow,double-ultotal,double-ulnow);
};
蒸汽http::蒸汽http()
{
m_curl=curl_easy_init();
}
SteamHTTP::~SteamHTTP()
{
旋度,易于清洁(m_旋度);
}
size\u t streamhttp::write\u func(char*data,size\u t size,size\u t nmemb,void*userdata)
{
streamhttp*ptr=reinterpret_cast(userdata);
ptr->m_currentRequestString设置值(dlnow*100.0f/dlnow);
返回0;
}
void-SteamHTTP::DownloadAllGames(const-wxString&username,wxGauge*gauge)
{
std::字符串url;
编码结果;
//构建URL
url=std::字符串(“http://steamcommunity.com/id/“”+username.mbc_str()+std::string(“/games?tab=all&xml=1”);
//设置URL
curl_easy_setopt(m_curl,CURLOPT_URL,URL.c_str());
//跟随重定向
curl_easy_setopt(m_curl,CURLOPT_FOLLOWLOCATION,1);
//数据回调
curl\u easy\u setopt(m\u curl,CURLOPT\u WRITEFUNCTION,streamhttp::write\u func);
curl_easy_setopt(m_curl,CURLOPT_WRITEDATA,this);
//进度回调
curl_easy_setopt(m_curl,CURLOPT_PROGRESSFUNCTION,streamhttp::progress_func);
curl_easy_setopt(m_curl,CURLOPT_PROGRESSDATA,gauge);
curl\u easy\u setopt(m\u curl,CURLOPT\u NOPROGRESS,FALSE);
//表演
结果=curl\u easy\u perform(m\u curl);
如果(结果!=0){
wxMessageBox(curl_easy_strerror(result),wxMessageBoxCaptionStr,wxICON_ERROR | wxOK);
}
}
我要做的是可靠地说出libcurl何时实际完成。有回电吗?我需要它来解析下载的数据

判断libcurl是否完成以及我是否可以处理数据的最佳方法是什么?

p、 s:此代码正在工作中,检查需要编写等。

在回调中,参数很少:

int function(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow);
dltotal
是要下载的总字节数,dlnow是到目前为止下载的字节数。下载在
dltotal==dlnow
时完成

dltotal
是libcurl希望在此传输中下载的总字节数
dlnow
是到目前为止下载的字节数


当curl\u easy\u perform()返回时,就完成了。就这么简单。检查返回代码以确定它是否成功。

如果发现,则此操作无效。因为如果使用ASCII传输,则大小始终为0。真糟糕。