Bināru libcurl atbilžu saņemšana C++ std::string
Nododiet std::string kā atgriezeniskā izsaukuma kontekstu un pievienojiet skaidrus baitu skaitus, saņemot binārus datus ar libcurl.
Starpniekserveris var veiksmīgi iegūt HTML un tomēr sabojāt attēlu, kopējot to C++ buferī. Pirms maināt starpniekservera protokolu, pārbaudiet saņemšanas atgriezenisko izsaukumu un objektu, kas nodots kā tā konteksts.
CURLOPT_WRITEDATA nodrošina rādītāju uz rakstīšanas atgriezenisko izsaukumu. Bez pielāgota atgriezeniskā izsaukuma libcurl noklusējuma rakstītājs gaida FILE *. Adrese, piemēram, &response, kur response ir std::string, ir jēgpilna tikai tad, kad jūsu atgriezeniskais izsaukums pārveido šo kontekstu atpakaļ uz paredzēto tipu.
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;
}Reģistrējiet abas puses uz vienkāršā roktura, kas tiek izmantots pārsūtīšanai:
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);Izsaukums append izmanto piegādāto baitu skaitu. Atgriezeniskā izsaukuma dati nav null-terminēti, un attēls var saturēt nulles baitus; mērīšana ar strlen zaudētu daļu no pamatteksta. Atbilde var arī ierasties pa daudziem dažāda lieluma izsaukumiem.
Patērētā baitu skaita atgriešana pieņem daļu. Cita skaita atgriešana pārtrauc pārsūtīšanu ar rakstīšanas kļūdu. Izņēmumu aizsargs neļauj atmiņas piešķiršanas kļūmei izkļūt ārpus C atgriezeniskā izsaukuma robežas; izsaucējam joprojām ir jāpārbauda pārsūtīšanas rezultāts, pirms response tiek uzskatīts par pilnu failu.
Turiet virkni dzīvu, līdz pārsūtīšana beidzas. Ja asinhronā ligzdas rakstīšana pēc tam pārsūta tās saturu, turiet šos baitus dzīvus, līdz arī šī rakstīšana beidzas. Lielām atbildēm ierobežota straumēšanas kārtība ir labāka par visa pamatteksta uzkrāšanu.