באַקומען בינאַרע 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 דאַטן זענען נישט null-פֿאַרענדיקט, און אַ בילד קען האָבן נול ביטעס; מעסטן מיט strlen וואָלט פֿאַרלירן אַ טייל פֿון דעם גוף. אַן ענטפֿער קען אויך אָנקומען דורך פֿיל רופֿן פֿון פֿאַרשידענע גרייסן.
צוריקקערן די פֿאַרבראַכטע ביטע צאָל אַקסעפּטירט דעם שטיק. צוריקקערן אַן אַנדער צאָל פֿאַרמאַכט די איבערפֿירונג מיט אַ שרײַבן טעות. דער אויסנאַם וועכטער פֿאַרהיט אַ צוטיילונג דורכפֿאַל פֿון אַנטלויפֿן איבער דער C callback גרענעץ; דער רופֿער מוז נאָך אַלץ פּרוּוון דעם איבערפֿירונג רעזולטאַט פֿאַר ער באַהאַנדלט response ווי אַ פֿולשטענדיק טעקע.
האַלט דעם שטריק לעבעדיק ביז די איבערפֿירונג ענדיקט זיך. אויב אַ אַסינכראָן סאָקעט שרײַבונג שיקט ווײַטער איר אינהאַלט, האַלט די ביטעס לעבעדיק ביז אויך יענע שרײַבונג ענדיקט זיך. פֿאַר גרויסע ענטפֿערס איז אַ באַגרענעצטע סטרימינג אָרדענונג בעסער ווי אַנזאַמלען דעם גאַנצן גוף.