Proksi HTML ni muvaffaqiyatli olib, baribir rasmni C++ buferiga ko'chirishda uni buzishi mumkin. Proksi protokolini o'zgartirishdan oldin qabul qilish callback ini va uning konteksti sifatida uzatilgan obyektni tekshiring.

CURLOPT_WRITEDATA yozish callback iga ko'rsatkich beradi. Maxsus callback bo'lmasa, libcurl ning standart yozuvchisi FILE * ni kutadi. &response kabi manzil, bu yerda response std::string, faqat sizning callback ingiz bu kontekstni nazarda tutilgan turga qaytarsa ma'noga ega.

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;
}

Ikkala yarmini uzatish uchun ishlatiladigan oddiy tutqichga ro'yxatdan o'tkazing:

std::string response;
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, receive);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);

append chaqiruvi berilgan bayt sonidan foydalanadi. Callback ma'lumotlari null bilan tugamaydi va rasmda nol baytlar bo'lishi mumkin; strlen bilan o'lchash tananing bir qismini yo'qotadi. Javob turli o'lchamdagi ko'plab callback chaqiruvlari orqali ham kelishi mumkin.

Iste'mol qilingan bayt sonini qaytarish bo'lakni qabul qiladi. Boshqa sonni qaytarish uzatishni yozish xatosi bilan to'xtatadi. Istisno qo'riqchisi xotira ajratish muvaffaqiyatsizligining C callback chegarasidan chiqib ketishini oldini oladi; chaqiruvchi response ni to'liq fayl deb hisoblashdan oldin uzatish natijasini tekshirishi kerak.

Uzatish tugagunicha satrni tirik saqlang. Agar asinxron soket yozuvi keyin uning mazmunini uzatsa, o'sha yozuv ham tugagunicha bu baytlarni tirik saqlang. Katta javoblar uchun butun tanani to'plashdan ko'ra cheklangan oqim tartibi afzalroq.

O'xshash maqolalar