cURL:空闲超时间隔超过指定值

时间:2010-11-12 12:06:25

标签: linux curl timeout

我正在使用libcurl创建与服务器的http连接。在初始化期间,我指定了5秒的空闲超时值,并且还指定了进度回调函数。我期待cURL在5秒不活动后中止连接并停止调用进度回调但我发现卷曲在大约15秒后超时。为什么curl比我指定的更多时间超时?将超时设置为较大的值无济于事。如果我指定100秒,则在105秒不活动后超时。

code = s_curl_easy_setopt(m_curl_handle, CURLOPT_NOPROGRESS, 0);
assert(code == CURLE_OK);
code = s_curl_easy_setopt(m_curl_handle, CURLOPT_PROGRESSFUNCTION, progress_callback);
assert(code == CURLE_OK);

编辑:超时代码

//this will set the timeout for quitting in case the network goes down
code = s_curl_easy_setopt(m_curl_handle, CURLOPT_LOW_SPEED_LIMIT, 1);
code = s_curl_easy_setopt(m_curl_handle, CURLOPT_LOW_SPEED_TIME, m_idle_timeout);

2 个答案:

答案 0 :(得分:7)

我已经想到了这一个。 cURL大约每秒更新一次进度。要计算空闲超时,cURL计算6次更新的平均字节数/秒,并将其与CURLOPT_LOW_SPEED_LIMIT进行比较。如果此值在一段时间内小于CURLOPT_LOW_SPEED_LIMIT超过CURLOPT_LOW_SPEED_TIME秒,则会超时。因此,如果CURLOPT_LOW_SPEED_TIME为5秒,则cURL将计算过去6次进度更新中的平均字节数/秒(约5秒),然后检查它是否小于CURLOPT_LOW_SPEED_LIMIT至少5秒,因此总时间约为10秒。

答案 1 :(得分:0)

(1)关于PROGRESSFUNCTION的Libcurl文档说:

  

此函数由libcurl调用   而不是其内部等价物   经常间隔期间   操作(大约每秒一次或   更快)无论数据是否存在   转移与否。

(2)你指的是哪个“超时”?我能找到的唯一一个与连接超时相关的内容,它与建立连接后终止连接无关,也没有发送数据 - 正如您所暗示的那样。