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