Chinaunix首页 | 论坛 | 博客
  • 博客访问: 93333
  • 博文数量: 9
  • 博客积分: 330
  • 博客等级: 一等列兵
  • 技术积分: 117
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-05 18:36
文章分类

全部博文(9)

文章存档

2012年(4)

2011年(1)

2010年(4)

分类: C/C++

2011-04-20 12:32:30


关于设置 curl 读写超时的解决方法:

1.C/C++编程实现
curl_easy_setopt(m_curl, CURLOPT_LOW_SPEED_LIMIT, 1L);
curl_easy_setopt(m_curl, CURLOPT_LOW_SPEED_TIME, 5L);
是说: 当 transfer speed 小于 1字节/秒 时 将会在 5秒内 abort 这个 transfer 我的理解 transfer speed 既可以是下载速度, 也可以是上传速度.
 
2.命令行实现:
curl -o t "" --speed-time 5 --speed-limit 1
是说: 当传输速度< 1 字节/秒 持续 5 秒时,该连接会终止.

3.curl源码中的实现
CURLOPT_LOW_SPEED_LIMIT 或者 --speed-limit 不可设置为0, 0是无效的, 程序内部实现如下:
 
lib/url.c:1206:
  case CURLOPT_LOW_SPEED_LIMIT:
    /*   
     * The low speed limit that if transfers are below this for
     * CURLOPT_LOW_SPEED_TIME, the transfer is aborted.
     */

    data->set.low_speed_limit=va_arg(param, long);

 
lib/speedcheck.c:40:
CURLcode Curl_speedcheck(struct SessionHandle *data, struct timeval now)
{
  if((data->progress.current_speed >= 0) &&
     data->set.low_speed_time &&
     (Curl_tvlong(data->state.keeps_speed) != 0) &&
     (data->progress.current_speed < data->set.low_speed_limit)) { /* <--如果 low_speed_limit=0,当时current_speed也为0时,该表达式将始终为假.所以在设置low_speed_limit相关参数时,要大于等于1 */
    long howlong = Curl_tvdiff(now, data->state.keeps_speed);

    /* We are now below the "low speed limit". If we are below it
       for "low speed time" seconds we consider that enough reason
       to abort the download. */


    if( (howlong/1000) > data->set.low_speed_time) {
      /* we have been this slow for long enough, now die */
      failf(data,
            "Operation too slow. "
            "Less than %d bytes/sec transfered the last %d seconds",
            data->set.low_speed_limit,
            data->set.low_speed_time);
      return CURLE_OPERATION_TIMEOUTED;
    }
    Curl_expire(data, howlong);
  } else {
    /* we keep up the required speed all right */
    data->state.keeps_speed = now;

    if(data->set.low_speed_limit)
      /* if there is a low speed limit enabled, we set the expire timer to
         make this connection's speed get checked again no later than when
         this time is up */

      Curl_expire(data, data->set.low_speed_time*1000);
  }
  return CURLE_OK;
}
 
PS: 源码来自 curl-7.16.2
------------- end -------------
From: GS
-------------------------------

阅读(9496) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~