2017-09-14 9 views
0

シングルカールリクエストでカールエラー(タイムアウトエラー)メッセージをキャッチする方法を知っています。それは次のようなものです。マルチエラー環境でのカールエラー、つまりタイムアウトの捕捉方法

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

resが、我々は我々がすべてのカールrequest.Howを追加するためにcurl_multi_add_handleを使用multicurl要求 を使用するときにそれを行う方法、それはCURLE_OPERATION_TIMEDOUT などのようないくつかのエラーですが、私は知りたい、その後curl_okされていない場合 タイムアウト時間とエラーメッセージの取得方法を設定してください。

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コードを使用しています。

答えて

1

キーはcurl_multi_info_read()関数で、マルチインターフェイスを使用すると完了した転送に関する情報を返します。 curl_multi_perform()の後に呼び出すと、タイムアウトした転送でそのエラーコードが設定されます。

カールの本のDriving with the multi interfaceの章、またはmulti-app.cのような例を使用したマルチインターフェイスも参照してください。

関連する問題