使用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

使用libcurl遇到的坑_第1张图片

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

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

使用libcurl遇到的坑_第2张图片

使用libcurl遇到的坑_第3张图片 

在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,否则会导致数据异常。

 

你可能感兴趣的:(开源lib)