Prejemanje binarnih odgovorov libcurl v C++ std::string
Posredujte std::string kot kontekst povratnega klica in pri prejemanju binarnih podatkov z libcurlom dodajte eksplicitna števila bajtov.
Posrednik lahko uspešno pridobi HTML in kljub temu pokvari sliko, ko jo kopira v medpomnilnik C++. Preden spremenite protokol posrednika, preverite povratni klic za prejemanje in objekt, posredovan kot njegov kontekst.
CURLOPT_WRITEDATA zagotavlja kazalec na povratni klic za pisanje. Brez povratnega klica po meri privzeti pisec libcurla pričakuje FILE *. Naslov, kot je &response, kjer je response std::string, ima smisel le, ko vaš povratni klic pretvori ta kontekst nazaj v predvideni tip.
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;
}Registrirajte obe polovici na preprostem ročaju, ki se uporablja za prenos:
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);Klic append uporablja dostavljeno število bajtov. Podatki povratnega klica niso zaključeni z ničlo in slika lahko vsebuje ničelne bajte; merjenje s strlen bi izgubilo del telesa. Odgovor lahko prispe tudi prek številnih klicev različnih velikosti.
Vračanje porabljenega števila bajtov sprejme del. Vračanje drugega števila prekine prenos z napako pisanja. Varovalo izjem prepreči, da bi napaka pri dodeljevanju ušla čez mejo povratnega klica C; klicatelj mora še vedno preveriti rezultat prenosa, preden response obravnava kot celotno datoteko.
Ohranite niz živ, dokler se prenos ne konča. Če asinhroni zapis v vtičnico nato posreduje njegovo vsebino, ohranite te bajte žive, dokler se tudi ta zapis ne konča. Za velike odgovore je omejena pretočna ureditev boljša od kopičenja celotnega telesa.