【问题标题】:cURL: idle timeout interval more than specified valuecURL:空闲超时间隔超过指定值
【发布时间】:2010-11-12 12:06:25
【问题描述】:

我正在使用libcurl 创建到服务器的 http 连接。在初始化期间,我指定了 5 秒的空闲超时值,并且还指定了进度回调函数。我期待 cURL 在 5 秒不活动后中止连接并停止调用进度回调,但我发现 curl 在大约 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);

【问题讨论】:

    标签: linux curl timeout


    【解决方案1】:

    我已经弄清楚了这一点。 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 秒。

    【讨论】:

      【解决方案2】:

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

      这个函数被 libcurl 调用 而不是其内部等价物 期间有频繁的间隔 操作(大约每秒一次或 更快)无论数据是否正在 转让与否。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-31
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多