2010-06-16 2 views
3

Код ниже - это тест для CURL C API. Проблема в том, что функция обратного вызова write_callback никогда не вызывается. Зачем ?CURL C API: обратный вызов не был вызван

/** compilation: g++ source.cpp -lcurl */ 

#include <assert.h> 
#include <iostream> 
#include <cstdlib> 
#include <cstring> 
#include <cassert> 
#include <curl/curl.h> 

using namespace std; 

static size_t write_callback(void *ptr, size_t size, size_t nmemb, void *userp) 
{ 
    std::cerr << "CALLBACK WAS CALLED" << endl; 
    exit(-1); 
    return size*nmemb; 
} 

static void test_curl() 
{ 
    int any_data=1; 
    CURLM* multi_handle=NULL; 
    CURL* handle_curl = ::curl_easy_init(); 
    assert(handle_curl!=NULL); 
    ::curl_easy_setopt(handle_curl, CURLOPT_URL, "http://en.wikipedia.org/wiki/Main_Page"); 
    ::curl_easy_setopt(handle_curl, CURLOPT_WRITEDATA, &any_data); 
    ::curl_easy_setopt(handle_curl, CURLOPT_VERBOSE, 1); 
    ::curl_easy_setopt(handle_curl, CURLOPT_WRITEFUNCTION, write_callback); 
    ::curl_easy_setopt(handle_curl, CURLOPT_USERAGENT, "libcurl-agent/1.0"); 

    multi_handle = ::curl_multi_init(); 
    assert(multi_handle!=NULL); 
    ::curl_multi_add_handle(multi_handle, handle_curl); 
    int still_running=0; 
    /* lets start the fetch */ 
    while(::curl_multi_perform(multi_handle, &still_running) == 
      CURLM_CALL_MULTI_PERFORM); 
    std::cerr << "End of curl_multi_perform."<< endl; 
    //cleanup should go here 
    ::exit(EXIT_SUCCESS); 
} 

int main(int argc,char** argv) 
{ 
    test_curl(); 
    return 0; 
} 

Большое спасибо

Pierre

ответ

6

Вы должны проверить значение still_running и вызвать curl_multi_perform() снова, если все еще в ожидании операции.

Простой пример:

int still_running=0; 
/* lets start the fetch */ 
do { 
    while(::curl_multi_perform(multi_handle, &still_running) == 
     CURLM_CALL_MULTI_PERFORM); 
} while (still_running); 
+2

, но, конечно, вы выбираете() или аналогичное промежуточный, а также, в противном случае (если вы просто скопировать этот пример) ваша программа будет занята петля, как сумасшедшие и использовать 100% CPU –

+0

@ DanielStenberg Что значит? Я не могу добавить этот пример в функцию test_curl? что кажется неправильным? –

+0

Ваша программа будет занята, как сумасшедшая, означает, что она никогда не остановится или не остановится или не подождет, когда она –

Смежные вопросы