Derbyn ymatebion binari libcurl i std::string C++
Trosglwyddwch std::string fel cyd-destun galwad yn ôl ac ychwanegwch gyfrifon beitiau penodol wrth dderbyn data binari gyda libcurl.
Gall dirprwy adalw HTML yn llwyddiannus ac eto lygru delwedd wrth ei chopïo i fferyllfa C++. Cyn newid protocol y dirprwy, gwiriwch y alwad yn ôl derbyn a'r gwrthrych a drosglwyddir fel ei gyd-destun.
CURLOPT_WRITEDATA sy'n darparu pwyntydd i'r alwad yn ôl ysgrifennu. Heb alwad yn ôl addasedig, mae ysgrifennwr diofyn libcurl yn disgwyl FILE *. Dim ond pan fo eich galwad yn ôl yn bwrw'r cyd-destun hwnnw'n ôl i'r math a fwriedir y mae cyfeiriad fel &response, lle mae response yn std::string, yn gwneud synnwyr.
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;
}Cofrestrwch y ddwy hanner ar y ddolen syml a ddefnyddir ar gyfer y trosglwyddiad:
std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);Mae'r alwad append yn defnyddio'r cyfrif beitiau a ddanfonwyd. Nid yw data alwad yn ôl wedi'i derfynu â sero, a gall delwedd gynnwys beitiau sero; byddai mesur â strlen yn colli rhan o'r corff. Gall ymateb hefyd gyrraedd trwy lawer o alwadau o wahanol feintiau.
Mae dychwelyd y cyfrif beitiau a ddefnyddiwyd yn derbyn y darn. Mae dychwelyd cyfrif gwahanol yn terfynu'r trosglwyddiad gyda gwall ysgrifennu. Mae'r gwarchodwr eithriadau'n atal methiant dyrannu rhag dianc trwy ffin alwad C; rhaid i'r galwr wirio canlyniad y trosglwyddiad o hyd cyn trin response fel ffeil gyflawn.
Cadwch y llinyn yn fyw nes bod y trosglwyddiad yn gorffen. Os yw ysgrifiad soced annormal wedyn yn anfon ei gynnwys ymlaen, cadwch y beitiau hynny'n fyw nes bod yr ysgrifiad hwnnw hefyd yn gorffen. Ar gyfer ymatebion mawr, mae trefniant ffrydio wedi'i ffinio'n well na chronni'r corff cyfan.