【问题标题】:Handle connection error with libCurl使用 libCurl 处理连接错误
【发布时间】:2014-03-18 16:43:08
【问题描述】:

我以多线程方式(curl_multi_perform)使用 libCurl,但不知道如何实现,以便我可以处理丢失网络连接(或任何 HTTP 错误)的情况。 当出现任何网络问题时,它看起来永远不会调用我的回调。虽然在详细模式下我看到了以下日志:

…. * getaddressinfo (3) failed.
    * Couldn't resolve host xxxx

我已经设置了:

           …...
    curl_easy_setopt(curl, CURLOPT_URL, actual_url);
    curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
          ……

              CURLMcode cm = curl_multi_add_handle(multi_handle, curl);
    cm = curl_multi_perform(multi_handle, &request_handle_count);

    printf("CURL_MULTI_PERFORM: %d\n", cm);

在网络故障中"callback" 函数中没有任何内容:(

【问题讨论】:

    标签: c++ curl


    【解决方案1】:

    CURLOPT_WRITEFUNCTION 用于检索响应数据。在网络故障时将没有数据。所以不会调用回调。要识别网络故障转移,您必须使用 curl_multi_perform 的返回码。您可以制作自己的回调函数,并在返回码 (cm) 不等于 CURLM_OK 时调用它。要获得回调功能,您可以保存函数指针然后调用它。

    char ErrorStr[200];
    

    //这个函数会被调用

    void OnError(CURLMcode errorCode, char* Error)
    {
    
    }
    

    //在你的代码中

    CURLMcode res;
    do{
        res =  curl_multi_perform(curlm, &count);
    
    }while(res == CURLM_CALL_MULTI_PERFORM);
    
    if(res != CURLM_OK)
    {
      slprintf(ErrorStr, 200, "curl_multi_perform() failed: %s\n",
              curl_multi_strerror(res));
        OnError(res, ErrorStr);
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 2016-10-11
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多