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-ыг бүрэн файл гэж үзэхээс өмнө дамжуулалтын үр дүнг шалгах ёстой.
Дамжуулалт дуустал мөрийг амьд байлгаарай. Хэрэв асинхрон сокетын бичилт дараа нь түүний агуулгыг дамжуулбал, тэр бичилт ч дуустал тэдгээр байтыг амьд байлгаарай. Том хариултын хувьд бүх биеийг хуримтлуулахаас илүү хязгаарлагдмал урсгалын зохион байгуулалт дээр.