使用libcurl遇到的坑

1、当断网或者网络较差,上传文件、下载文件或者和HTTP请求等出现死锁

需要设置一些超时等参数,如下:

curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10L);
    /* abort if slower than 1 bytes/sec during 6 seconds */

curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, 1);

curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME,  6);

2、在上传文件时,无网络等,耗时300s

curl_easy_perform failed, error code: 28

主要的原因是设置 curl_setopt(curl, CURLOPT_NOSIGNAL,1L);   该选项禁止访问超时候抛出超时信号。

打开setopt.c查看时,源码如下:

 

在connect.c中定义:连接超时默认为300s

#define DEFAULT_CONNECT_TIMEOUT 300000 /* milliseconds == five minutes */ 

3、正常使用流程是先调用curl_global_init初始化资源,而这个函数不是线程安全的。curl_easy_init发现没有做初始化时会自动初始化,多个线程同时进行curl_easy_init时会导致异常。curl官方建议在主线程中先做初始化。

curl_global_init(CURL_GLOBAL_ALL); 

4、设置进度条用curl_easy_setopt(curlhandle, CURLOPT_XFERINFOFUNCTION, progress_callback);需要注意的是CURLOPT_XFERINFOFUNCTION所对应的回调函数参数必须是curl_off_t,不能使double;但CURLOPT_PROGRESSFUNCTION所对应的回调函数必须是double,不能输curl_off_t。如果形参设置不对,会导致数据出现异常。官方建议使用CURLOPT_XFERINFOFUNCTION,它是CURLOPT_PROGRESSFUNCTION的替代品。

注意,在设置curl_easy_setopt(curlhandle, CURLOPT_RESUME_FROM_LARGE, resume_position)参数resume_position必须是curl_off_t,不能使int或double,否则会导致数据异常。

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值