【问题标题】:CURL C API: callback was not calledCURL C API:未调用回调
【发布时间】:2011-03-04 16:05:25
【问题描述】:

下面的代码是对 CURL C API 的测试。问题是回调函数write_callback 从未被调用过。为什么?

/** 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;
}

非常感谢

皮埃尔

【问题讨论】:

    标签: c++ c curl callback libcurl


    【解决方案1】:

    您需要检查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);
    

    【讨论】:

    • 当然你也可以在两者之间选择()或类似的,否则(如果你只是复制这个例子)你的程序将疯狂循环并使用 100% cpu
    • @DanielStenberg 你是什么意思?我不能在 test_curl 函数中添加这个例子吗?似乎有什么问题?
    • 你的程序会疯狂循环,这意味着它永远不会停止、暂停或等待
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多