libcurl как узнать, что передача завершена при использовании мультиинтерфейса? - PullRequest
0 голосов
/ 14 июля 2020

Я знаю, что при использовании простого интерфейса это не проблема, потому что после возврата curl_easy_perform передача завершена. Но как я узнаю об этом при использовании мультиинтерфейса? После просмотра документа. Это единственный способ, который я придумал до сих пор:

class CompleteListener {
public:
  virtual void onComplete(CURLcode) = 0;
};

CURLMsg* msg = curl_multi_info_read(...);
void* ptr;
if(msg && msg->msg == CURLMSG_DONE)
{
    curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, &ptr);
    static_cast<CompleteListener*>(ptr)->onComplete(msg->data.result);
}

Проблема с этим подходом состоит в том, что теперь все частные указатели должны указывать на экземпляр производного класса CompleteListener. Если есть способ сохранить указатель в CURLOPT_WRITEDATA, я также могу просто сохранить обратный вызов внутри CURLOPT_PRIVATE.

1 Ответ

1 голос
/ 15 июля 2020

Когда вы вызываете curl_multi_perform () (или curl_multi_socket_action () ), вы включаете указатель на счетчик, который возвращает количество текущих «активных» передач. Когда этот счетчик уменьшается или даже достигает нуля, вы знаете, что одна или несколько передач были завершены.

Когда вы вызываете curl_multi_info_read () (возможно, после того, как вы вызываете curl_multi_perform()), он может вернуть указатель на сообщение от libcurl, которое может рассказать вам, как легко обработать завершенную передачу (и его код возврата). Если выполнено более одной передачи, повторные вызовы функции будут возвращать больше информации, пока вы не вернете NULL, когда больше нет информации, которую нужно получить.

Вы можете найти это в многочисленных примерах размещено на веб-сайте curl, например, мульти-приложение одно.

...