Ricevi binaran libcurl-respondojn en C++ std::string
Transdonu std::string kiel kuntekston de la reaga funkcio kaj aldonu eksplicitajn bajtokalkulojn kiam vi ricevas binaran datumaron per libcurl.
Prokurilo povas sukcese akiri HTML kaj tamen difekti bildon dum ĝi kopias ĝin en C++ bufron. Antaŭ ol ŝanĝi la prokuran protokolon, kontrolu la ricevan reagan funkcion kaj la objekton donitan kiel ĝian kuntekston.
CURLOPT_WRITEDATA donas montrilon al la skriba reaga funkcio. Sen propra reaga funkcio, la defaŭlta skribilo de libcurl atendas FILE *. Adreso kiel &response, kie response estas std::string, havas sencon nur kiam via reaga funkcio retrokastas tiun kuntekston al la celata tipo.
static size_t receive(char* data, size_t size,
size_t count, void* context) {
const size_t bytes = size * count;
auto* body = static_cast<std::string*>(context);
try {
body->append(data, bytes);
} catch (...) {
return 0;
}
return bytes;
}Registru ambaŭ duonojn sur la simpla hanto uzata por la transdono:
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);La alvoko append uzas la liveritan bajtokalkulon. Reagaj datumoj ne estas nul-finigitaj, kaj bildo povas enhavi nulajn bajtojn; mezuri ĝin per strlen perdus parton de la korpo. Respondo ankaŭ povas alveni per multaj reagoj de malsamaj grandecoj.
Redoni la konsumitan bajtokalkulon akceptas la pecon. Redoni alian kalkulon haltigas la transdonon per skriba eraro. La escepta gardo malhelpas, ke memora asigno-malsukceso eskapu tra la C-reaga limo; la vokanto ankoraŭ devas kontroli la transdonan rezulton antaŭ ol trakti response kiel kompletan dosieron.
Tenu la ĉenon viva ĝis la transdono finiĝos. Se asinkrona ingo-skribo poste plusendas ĝian enhavon, tenu tiujn bajtojn vivaj ĝis ankaŭ tiu skribo finiĝos. Por grandaj respondoj, limigita fluiga aranĝo preferindas al amasigado de la tuta korpo.