پروکسي کولی شي HTML په بریالیتوب سره راوړي او بیا هم د عکس په C++ بفر کې کاپي کولو پر مهال هغه خراب کړي. د پروکسي پروتوکول بدلولو دمخه، د ترلاسه کولو 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 ډاټا د صفر سره نه پای ته رسیږي، او عکس کې کیدای شي صفر بایټونه وي؛ د strlen سره اندازه کول به د بدن یوه برخه له لاسه ورکړي. ځواب کیدای شي د مختلفو اندازو ډیرو callback غوښتنو له لارې هم راشي.

د کارول شوې بایټ شمېرې بیرته راګرځول هغه ټوټه مني. د بلې شمېرې بیرته راګرځول لېږد د لیکنې تېروتنې سره بندوي. د استثنا ساتونکی د حافظې د تخصیص ناکامي د C callback له حد څخه د تېښتې مخه نیسي؛ غوښتونکی باید لاهم د response د بشپړ فایل په توګه د منلو دمخه د لېږد پایله وګوري.

تر هغه چې لېږد پای ته ورسیږي تار ژوندی وساتئ. که یو غیر همغږي ساکټ لیکنه بیا د هغې منځپانګه واستوي، هغه بایټونه تر هغه چې هغه لیکنه هم بشپړه شي ژوندي وساتئ. د لویو ځوابونو لپاره، د ټول بدن راټولولو په پرتله محدوده جریاني ترتیب غوره دی.

اړوندې مقالې