Я пришел использовать curl
, синхронно выполняя http-запрос. Мой вопрос: как я могу сделать это асинхронно?
Я сделал несколько поисков, которые привели меня к документации интерфейса curl_multi_*
из этого question, и этот пример, но он ничего не решал.
Мой упрощенный код:
CURLM *curlm;
int handle_count = 0;
curlm = curl_multi_init();
CURL *curl = NULL;
curl = curl_easy_init();
if(curl)
{
curl_easy_setopt(curl, CURLOPT_URL, "https://stackoverflow.com/");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback);
curl_multi_add_handle(curlm, curl);
curl_multi_perform(curlm, &handle_count);
}
curl_global_cleanup();
Метод обратного вызова writeCallback
не вызывается и ничего не происходит.
Пожалуйста, посоветуйте мне.
EDIT:
Согласно @Remy ниже ответа, я получил это, но кажется, что это не совсем то, что мне действительно нужно. Причина использования цикла по-прежнему является блокирующей. Скажите, пожалуйста, если я ошибаюсь или что-то недопонимаю. Я на самом деле довольно новичок в С++.
Здесь снова мой код:
int main(int argc, const char * argv[])
{
using namespace std;
CURLM *curlm;
int handle_count;
curlm = curl_multi_init();
CURL *curl1 = NULL;
curl1 = curl_easy_init();
CURL *curl2 = NULL;
curl2 = curl_easy_init();
if(curl1 && curl2)
{
curl_easy_setopt(curl1, CURLOPT_URL, "https://stackoverflow.com/");
curl_easy_setopt(curl1, CURLOPT_WRITEFUNCTION, writeCallback);
curl_multi_add_handle(curlm, curl1);
curl_easy_setopt(curl2, CURLOPT_URL, "http://google.com/");
curl_easy_setopt(curl2, CURLOPT_WRITEFUNCTION, writeCallback);
curl_multi_add_handle(curlm, curl2);
CURLMcode code;
while(1)
{
code = curl_multi_perform(curlm, &handle_count);
if(handle_count == 0)
{
break;
}
}
}
curl_global_cleanup();
cout << "Hello, World!\n";
return 0;
}
Теперь я могу выполнить 2 HTTP-запроса одновременно. Обратные вызовы вызываются, но их необходимо завершить до выполнения следующих строк. Должен ли я думать о потоке?