【问题标题】:How to catch curl error i.e time out in multicurl environment如何捕获卷曲错误,即在多卷曲环境中超时
【发布时间】:2017-09-14 11:51:42
【问题描述】:

我知道如何在单个 curl 请求中捕获 curl 错误(超时错误)消息。如下所示。

  curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT_MS, 100);
  res = curl_easy_perform(curl_handle);

如果 res 不是 curl_ok 那么它是一些错误,如 CURLE_OPERATION_TIMEDOUT 等但我想知道,当我们使用多卷请求时如何做到这一点 我们使用 curl_multi_add_handle 来添加每个 curl 请求。如何设置 超时时间以及如何捕获错误消息。

   bool cuev_emit(struct curlev *cuev, char *url, struct curl_slist *headers,
curlev_cb_t cb, void *cb_data)
 {
struct curlex *ex = NULL;
CURL *easy = curl_easy_init();
CURLMcode code;
if (!easy) {
    xsyslog(LOG_WARNING, "curl_easy_init() failed for url '%s' (errno: %d)",
            url, errno);
    return false;
}
curl_easy_setopt(easy, CURLOPT_URL, url);
curl_easy_setopt(easy, CURLOPT_VERBOSE, 0L);

curl_easy_setopt(easy, CURLOPT_SSL_VERIFYPEER, 0L);

curl_easy_setopt(easy, CURLOPT_WRITEFUNCTION, _curl_write_cb);
if (cb) {
    ex = calloc(1, sizeof(*ex));
    if (!ex) {
        xsyslog(LOG_WARNING, "cuev_emit() failed: calloc(%d) with errno: %d",
               (int)sizeof(*ex), errno);
        curl_easy_cleanup(easy);
        return false;
    }
    curl_easy_setopt(easy, CURLOPT_WRITEDATA, ex);
    curl_easy_setopt(easy, CURLOPT_PRIVATE, ex);
} else {
    curl_easy_setopt(easy, CURLOPT_WRITEDATA, NULL);
    curl_easy_setopt(easy, CURLOPT_PRIVATE, NULL);
}

if (headers) {
    /* TODO: добавить хидеры */
}

if ((code = curl_multi_add_handle(cuev->multi, easy)) != CURLM_OK) {
    xsyslog(LOG_WARNING, "curl_multi_add_handle() failed for url '%s', code: %d",
            url, code);
    curl_easy_cleanup(easy);
    return false;
}
return true;
  }

代码的主要部分在上面。我正在使用https://gist.github.com/bhardwaj75/7600b67726ae2cdbfcf8c9c74300ab69#file-libvev-curl-c 代码。

【问题讨论】:

    标签: libcurl


    【解决方案1】:

    关键是curl_multi_info_read() 函数,它在使用多接口时返回有关已完成传输的信息。在curl_multi_perform() 之后调用它并且超时传输将设置该错误代码。

    另请参阅 curl 书中的 Driving with the multi interface 章节,或使用例如 multi-app.c 的多接口示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 2019-12-16
      • 2017-07-06
      相关资源
      最近更新 更多