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'ту толук файл деп эсептебестен мурун өткөрүү жыйынтыгын текшерүүгө тийиш.
Өткөрүү бүткөнгө чейин сапты тирүү кармаңыз. Эгер асинхрондук сокет жазуусу кийин анын мазмунун жөнөтсө, ошол байттарды да жазуу бүткөнгө чейин тирүү кармаңыз. Чоң жооптор үчүн бүтүндөй денени топтоодон чектелген агымдык түзүлүш артык.