პროქსის შეუძლია 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-ით გაზომვა დაკარგავდა სხეულის ნაწილს. პასუხი ასევე შეიძლება მოვიდეს სხვადასხვა ზომის მრავალი callback გამოძახებით.

მოხმარებული ბაიტების რაოდენობის დაბრუნება იღებს ნაწილს. განსხვავებული რაოდენობის დაბრუნება წყვეტს გადაცემას ჩაწერის შეცდომით. გამონაკლისების დამცველი ხელს უშლის მეხსიერების გამოყოფის წარუმატებლობას C callback-ის საზღვრიდან გასვლაში; გამომძახებელმა მაინც უნდა შეამოწმოს გადაცემის შედეგი, სანამ response-ს სრულ ფაილად მიიჩნევს.

შეინახეთ სტრიქონი ცოცხალი, სანამ გადაცემა დასრულდება. თუ ასინქრონული სოკეტის ჩაწერა შემდეგ გადასცემს მის შიგთავსს, შეინახეთ ის ბაიტები ცოცხალი, სანამ ის ჩაწერაც დასრულდება. დიდი პასუხებისთვის შეზღუდული ნაკადური მოწყობა სჯობს მთელი სხეულის დაგროვებას.

დაკავშირებული სტატიები