libcurl erantzun binarioak C++ std::string batean jasotzea
Pasa std::string bat callback testuinguru gisa eta gehitu byte-kontaketa esplizituak libcurlekin datu binarioak jasotzean.
Proxy batek HTML ongi lor dezake eta, hala ere, irudi bat hondatu C++ buffer batean kopiatzen duen bitartean. Proxy protokoloa aldatu aurretik, egiaztatu jasotzeko callbacka eta haren testuinguru gisa pasatzen den objektua.
CURLOPT_WRITEDATA idazteko callbackarako erakusle bat ematen du. Callback pertsonalizaturik gabe, libcurl-en idazle lehenetsiak FILE * bat espero du. &response bezalako helbide batek, non response std::string bat den, zentzua du zure callbackak testuinguru hori xede den motara bihurtzen duenean soilik.
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;
}Erregistratu bi erdiak transferentziarako erabiltzen den helduleku sinplean:
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);append deiak emandako byte-kontaketa erabiltzen du. Callback datuak ez daude zeroz amaituta, eta irudi batek zero byte izan ditzake; strlen-ekin neurtzeak gorputzaren zati bat galduko luke. Erantzun bat tamaina desberdinetako callback deitzen bidez ere irits daiteke.
Kontsumitutako byte-kontaketa itzultzeak zatia onartzen du. Beste kontaketa bat itzultzeak transferentzia idazketa-errore batekin eteten du. Salbuespenen babesak memoria-esleipen huts bat C callbackaren mugatik ihes ez dadin eragozten du; deitzaileak transferentziaren emaitza egiaztatu behar du oraindik response fitxategi oso gisa tratatu aurretik.
Mantendu katea bizirik transferentzia amaitu arte. Gero socket idazketa asinkrono batek haren edukia aurreratzen badu, mantendu byte horiek bizirik idazketa hori ere amaitzen den arte. Erantzun handietarako, muga jakineko streaming antolamendua hobea da gorputz osoa pilatzea baino.