Binaarsete libcurl-vastuste vastuvõtmine C++ std::stringi
Edastage std::string callback-kontekstina ja lisage selged baidiarvud, kui võtate libcurl abil vastu binaarandmeid.
Puhverserver võib HTML-i edukalt hankida ja siiski pildi rikkuda, kui kopeerib selle C++ puhvrisse. Enne puhverserveri protokolli muutmist kontrollige vastuvõtu callbacki ja selle kontekstina edastatud objekti.
CURLOPT_WRITEDATA annab kirjutamise callbackile kursoril. Kohandatud callbackita ootab libcurli vaikekirjutaja FILE *. Selline aadress nagu &response, kus response on std::string, on mõttekas ainult siis, kui teie callback teisendab selle konteksti tagasi kavandatud tüübiks.
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;
}Registreerige mõlemad pooled ülekandmiseks kasutataval lihtsal käepidemel:
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);Kutse append kasutab edastatud baidiarvu. Callbacki andmed ei ole nullterminaatoriga lõpetatud ja pilt võib sisaldada nullbaite; strleniga mõõtmine kaotaks osa kehast. Vastus võib saabuda ka paljude erineva suurusega callback-kutsete kaudu.
Tarbitud baidiarvu tagastamine võtab tüki vastu. Erineva arvu tagastamine katkestab ülekande kirjutamisveaga. Erandikaitse hoiab ära, et mälueralduse tõrge pääseb C-callbacki piirist välja; kutsuja peab ikkagi kontrollima ülekande tulemust enne, kui käsitleb response'i täieliku failina.
Hoidke string elus, kuni ülekanne lõpeb. Kui asünkroonne soketi kirjutamine seejärel edastab selle sisu, hoidke neid baite elus, kuni ka see kirjutamine lõpeb. Suurte vastuste puhul on piiratud voogedastuskorraldus eelistatavam kui kogu keha kogumine.