1

マルチスレッド環境で curl バージョン 7.15.5 を使用しています。各スレッドは、独自の curl オブジェクトを初期化して解放しています。以下は、スレッドごとに実行されるコードです。

CURL* curl = curl_easy_init();

tRespBuffer respBuffer = {NULL, 0};
char errorBuf[CURL_ERROR_SIZE +1];
struct curl_slist *headers=NULL;
headers = curl_slist_append(headers, "Content-Type: text/xml; charset=gbk");
headers = curl_slist_append(headers, "Expect:");

curl_easy_setopt(curl, CURLOPT_URL, url_);

curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS,encr.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE,strlen(encr.c_str()));
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HttpSmsServer::processHttpResponse);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&respBuffer);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20);  // wait for 20 seconds before aborting the transacttion
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuf);  // error returned if any..
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);  // No signals allowed in case of multithreaded apps

res = curl_easy_perform(curl);

curl_slist_free_all(headers);
curl_easy_cleanup(curl);

4 つのスレッドすべてが同時に http サーバーにデータを送信しています。一部の POST 要求 (要求の約 3%) で HTTP 応答タイムアウトが発生しています。タイムアウトの理由は何ですか?http サーバーが応答するのに 20 秒以上かかることはないと思います。

4

1 に答える 1

0

CURLOPT_TIMEOUT には http リクエストのすべての時間が含まれています。巨大なデータを転送しましたか?

CURLOPT_TIMEOUT:libcurl 転送操作にかかる最大時間を秒単位で含む long as パラメータを渡します。通常、名前の検索にはかなりの時間がかかる可能性があり、操作を数分未満に制限すると、完全に正常な操作が中止される危険があります。

于 2013-12-11T08:29:53.637 に答える