libcurl இன் பைனரி பதில்களை C++ std::string இல் பெறுதல்
std::string ஐ callback context ஆக அனுப்பி, libcurl மூலம் பைனரி தரவைப் பெறும்போது வெளிப்படையான பைட் எண்ணிக்கைகளைச் சேர்க்கவும்.
ஒரு ப்ராக்ஸி HTML ஐ வெற்றிகரமாகப் பெற முடியும், இருப்பினும் ஒரு படத்தை C++ buffer இல் நகலெடுக்கும்போது அதை சிதைக்கலாம். ப்ராக்ஸி நெறிமுறையை மாற்றுவதற்கு முன், பெறும் callback மற்றும் அதன் context ஆக அனுப்பப்படும் பொருளைச் சரிபார்க்கவும்.
CURLOPT_WRITEDATA எழுத்து callback க்கு ஒரு சுட்டியை வழங்குகிறது. தனிப்பயன் callback இல்லாமல், libcurl இன் இயல்புநிலை எழுத்தாளர் FILE * எதிர்பார்க்கிறது. &response போன்ற முகவரி, response ஒரு std::string ஆக இருக்கும்போது, உங்கள் callback அந்த context ஐ நோக்கமான வகைக்குத் திருப்பும்போது மட்டுமே அர்த்தமுள்ளதாகும்.
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 தரவு null-terminated அல்ல, ஒரு படத்தில் பூஜ்ஜிய பைட்டுகள் இருக்கலாம்; strlen மூலம் அளந்தால் உடலின் ஒரு பகுதி இழக்கப்படும். ஒரு பதில் வெவ்வேறு அளவுகளின் பல callback அழைப்புகள் வழியாகவும் வரலாம்.
பயன்படுத்தப்பட்ட பைட் எண்ணிக்கையைத் திருப்பித் தருவது அந்தத் துண்டை ஏற்கிறது. வேறு எண்ணிக்கையைத் திருப்பித் தருவது எழுத்துப் பிழையுடன் பரிமாற்றத்தை நிறுத்துகிறது. விதிவிலக்கு காப்பாளர் ஒதுக்கீட்டுத் தோல்வி C callback எல்லையைக் கடந்து வெளியேறுவதைத் தடுக்கிறது; அழைப்பவர் response ஐ முழுமையான கோப்பாகக் கருதுவதற்கு முன் பரிமாற்ற முடிவை இன்னும் சரிபார்க்க வேண்டும்.
பரிமாற்றம் முடியும் வரை சரத்தை உயிர்ப்புடன் வைத்திருங்கள். ஒரு ஒத்திசைவற்ற socket எழுத்து பின்னர் அதன் உள்ளடக்கத்தை அனுப்பினால், அந்த எழுத்தும் முடியும் வரை அந்த பைட்டுகளை உயிர்ப்புடன் வைத்திருங்கள். பெரிய பதில்களுக்கு, முழு உடலையும் திரட்டுவதை விட வரம்புடைய ஸ்ட்ரீமிங் ஏற்பாடு சிறந்தது.