2013-10-05 34 views
8

CURLOPT_CONNECTTIMEOUT_MS = 200、CURLOPT_TIMEOUT_MS = 70msが設定されています。しかし、私はCURLINFO_TOTAL_TIMEが約220ミリ秒になるのを見ています。Curlが正しくタイムアウトしない

libcurl docによると、CURLOPT_TIMEOUT_MSには接続タイムアウトも含まれています。ですから、基本的に私のカールコールの合計時間は70ミリ秒を超えてはなりません。しかし、なぜそれが戻ってコントロールを返すのですか?

誰かがこの現象を説明できますか?

私はcurl 7.19_02 C++ライブラリを使用しています。

は、ここで私が得たタイミング情報は、以下の通りである私のコード

CURL * curl; 
curl = curl_easy_init(); 
curl_easy_setopt(curl, CURLOPT_URL, url); 
curl_easy_setopt(curl,CURLOPT_CONNECTTIMEOUT_MS,200); 
curl_easy_setopt(curl,CURLOPT_TIMEOUT_MS,70); 
curl_easy_setopt(curl, CURLOPT_HEADER, 0); 
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer); 
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); 
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); 

double tt = 0.0; 
double ns = 0.0; 
double ct = 0.0; 
double pt = 0.0; 
double st = 0.0; 

curl_easy_perform(curl); 

int curlRC = curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &tt); 
curlRC = curl_easy_getinfo(curl, CURLINFO_NAMELOOKUP_TIME, &ns); 
curlRC = curl_easy_getinfo(curl, CURLINFO_CONNECT_TIME, &ct); 
curlRC = curl_easy_getinfo(curl, CURLINFO_PRETRANSFER_TIME, &pt); 
curlRC = curl_easy_getinfo(curl, CURLINFO_STARTTRANSFER_TIME, &st); 

cout << "Curl timing info: Total: " << tt << endl << " Lookup: "<< ns << endl << " Connect: " << ct << "\n" << "pre transfer: " << pt << endl << "start transfer: " << st <<endl; 

です。合計::0.216793

検索:0.000999

接続:0.023199

前転送:0.023213

スタート転送:0.216667

ので

カールタイミング情報をこれをチェックしてくださいポイントは、事前転送と開始転送の間に何が起こっているかです。

+0

おそらくDNSの解決 – Brad

+0

どのcURLのバージョンを使用していますか? –

+0

あなたの誰かが説明することができます、何が原因である可能性があります。 HTTP要求にかかる時間を分けて説明できるとすばらしいでしょう。 – naveen

答えて

0

したがって、事前転送と開始転送の間に何が起こっていますか?

これは、サーバーが結果を計算して(要求を処理する)実際の時間であり、応答の最初のバイトを送信する準備ができています。要するに、実際のリクエストのサーバー時間であり、それが最大のものであると予想します。

2

バージョン7.20.0までのlibcurlのバグです。予想されるよう7.20.1で 出力は次のようになります。

Curl timing info: Total: 0.071098 
Lookup: 0.000116 
Connect: 0.000303 
pre transfer: 0.000327 
start transfer: 0 

私はバグを修正チェンジセットを見つけることができませんでした。しかし、 "サブ秒タイムアウトの改善"にある可能性がありますcURL Changes