Необходимые знания, необходимые для понимания API curl_multi: Asyn c Сокеты .
curl_multi_perform не является блокирующим API. Как объяснено в документации:
Когда приложение обнаружило, что есть данные, доступные для multi_handle, или истекло время ожидания, приложение должно вызвать эту функцию для чтения / записи того, что есть для чтения или записи. сейчас эт c. curl_multi_perform
возвращается, как только чтение / запись завершается.
Это просто нужно периодически вызывать.
Означает ли это, что мое приложение должно выполнять период c опрос, чтобы проверить, есть ли данные для чтения?
Да. curl_multi_fdset удобно извлекает соответствующие файловые дескрипторы, чтобы вы могли select
на них (select
= wait ), но вы можете добавлять другие дескрипторы одного и того же вызова select
, таким образом чередуя работу curl с вашей собственной работой. Вот пример того, как это сделать.
Есть ли способ справиться с обратными вызовами?
Да. Переданные данные передаются во время вызова curl_multi_perform
в обратный вызов CURLOPT_WRITEFUNCTION . Примечание: curl_multi_info_read не для чтения данных, а для чтения информации о передаче.
for (/* each transfer */) {
curl_easy_setopt(eh, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(eh, CURLOPT_WRITEDATA, /* pass userp value */);
curl_multi_add_handle(multi_handle, easy_handle);
}
int still_running;
do {
if (curl_multi_perform(cm, &still_running)) { // will call write_cb() when data is read
/* handle error */ break;
}
if (curl_multi_wait(cm, NULL, 0, 1000, NULL)) {
/* handle error */ break;
}
} while(still_running);
Вот полный пример использования обратного вызова данных с несколькими перевод: 10-в-время .
Примечание: curl_multi_wait , используемый в этом примере, является удобной оболочкой для вызова select
.