使用libCurl处理连接错误

时间:2014-03-18 16:43:08

标签: c++ curl

我以多线程方式使用libCurl(curl_multi_perform),但不知道如何实现,以便我可以处理丢失网络连接(或任何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"函数中没有任何内容:(

1 个答案:

答案 0 :(得分:0)

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);

}