Kupokea majibu ya binary ya libcurl ndani ya C++ std::string
Pitisha std::string kama muktadha wa callback na uongeze hesabu za byte zilizo wazi unapopokea data ya binary kwa libcurl.
Proksi inaweza kupata HTML kwa mafanikio na bado kuharibu picha inapoinakili kwenye buffer ya C++. Kabla ya kubadilisha itifaki ya proksi, angalia callback ya upokeaji na kitu kinachopitishwa kama muktadha wake.
CURLOPT_WRITEDATA hutoa kiashiria kwa callback ya uandishi. Bila callback maalum, mwandishi chaguo-msingi wa libcurl hutegemea FILE *. Anwani kama &response, ambapo response ni std::string, ina maana tu wakati callback yako inabadilisha muktadha huo kurudi kwa aina inayokusudiwa.
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;
}Sajili nusu zote mbili kwenye handle rahisi inayotumika kwa uhamishaji:
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);Wito wa append hutumia hesabu ya byte iliyotolewa. Data ya callback haiishii kwa null, na picha inaweza kuwa na byte sifuri; kuipima kwa strlen kungepoteza sehemu ya mwili. Jibu pia linaweza kufika kupitia wito nyingi za ukubwa tofauti.
Kurudisha hesabu ya byte zilizotumika kunakubali kipande hicho. Kurudisha hesabu tofauti kunasitisha uhamishaji kwa hitilafu ya uandishi. Mlinzi wa vighairi huzuia kushindwa kwa ugawaji kutoka nje ya mpaka wa callback ya C; mpigaji bado lazima aangalie matokeo ya uhamishaji kabla ya kuchukua response kama faili kamili.
Weka mfuatano hai hadi uhamishaji ukamilike. Ikiwa uandishi wa soketi usio sawa kisha uwasilishe maudhui yake, weka byte hizo hai hadi uandishi huo pia ukamilike. Kwa majibu makubwa, mpangilio wa utiririshaji wenye mipaka ni bora kuliko kukusanya mwili wote.