libcurl-дың бинарлық жауаптарын C++ std::string ішіне қабылдау
std::string-ті callback контексті ретінде беріп, libcurl арқылы бинарлық деректерді қабылдағанда байттардың нақты санын қосыңыз.
Прокси HTML-ді сәтті алып, бірақ суретті C++ буферіне көшіргенде оны бүлдіруі мүмкін. Прокси протоколын өзгертуден бұрын қабылдау callback-ін және оның контексті ретінде берілген нысанды тексеріңіз.
CURLOPT_WRITEDATA жазу callback-іне көрсеткіш береді. Арнайы callback болмаса, libcurl-дың әдепкі жазушысы FILE * күтеді. &response сияқты мекенжай, мұнда response — std::string, тек callback сол контексті көзделген типке қайтарғанда ғана мағыналы.
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;
}Екі бөлікті де тасымалдау үшін пайдаланылатын қарапайым дескрипторға тіркеңіз:
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);append шақыруы берілген байт санын пайдаланады. Callback деректері нөлмен аяқталмайды және суретте нөлдік байттар болуы мүмкін; strlen-мен өлшеу дененің бір бөлігін жоғалтады. Жауап әртүрлі өлшемдегі көптеген callback шақырулары арқылы да келуі мүмкін.
Жұмсалған байт санын қайтару үзіндіні қабылдайды. Басқа санды қайтару тасымалдауды жазу қатесімен тоқтатады. Ерекше жағдай қорғанысы жад бөлу сәтсіздігінің C callback шекарасынан шығуына жол бермейді; шақырушы response-ты толық файл деп санамас бұрын тасымалдау нәтижесін тексеруі керек.
Тасымалдау аяқталғанша жолды тірі ұстаңыз. Егер асинхронды сокет жазуы кейін оның мазмұнын жіберсе, сол байттарды да жазу аяқталғанша тірі ұстаңыз. Үлкен жауаптар үшін бүкіл денені жинақтаудан гөрі шектеулі ағындық құрылым артық.