user-0 提问: 一个使用libcurl发生阻塞的问题

回复:
user: user-1
content: 楼主是怎么解决的，同求

user: user-2
content: 我遇到了和楼主同样的问题，尝试了多种方式都没能解决，无奈之下只能求救于楼主，请问楼主你是用什么方法解决的。

user: user-3
content: 我也遇到过这个问题，我用的是easy模式。 我的解决方案是在回调函数中做处理： 具体方法就是在回调函数中判断下载前后的文件大小，如果相同就看相同的时间（自己设置超时时长）。超时直接返回，libcurl就会返回

user: user-4
content: 在return 0 之前加一个sleep(5);

user: user-5
content: 我是基于windows编程，curl_easy_perform 用法和楼上差不多，   curl = curl_easy_init();      if (curl){          curl_easy_setopt(curl, CURLOPT_URL, param->url.c_str());          curl_easy_setopt(curl, CURLOPT_WRITEDATA, *param->pOfstream);          curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_write_func);               curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 10*1000);          curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 10*1000);              res = curl_easy_perform(curl);   在一个子线程里面调用上面代码，有差不多5%概率发生阻塞，将整个进程卡死，最后定位代码在curl_easy_perform  在网上查了很多资料，大部分都说必须加超时，但是加完还是会发生阻塞！   curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 10*1000);       打印其返回值，一直为0！所以很困惑，不知道超时到底有没有效果，求助各位大神啊

user: user-6
content: 使用多进程调用libcurl 参考《Unix编程艺术》

user: user-5
content: 前辈~初学libcurl，也遇到这个问题！设置了超时，但是curl_easy_perform还是一直阻塞，请指教

user: user-7
content: typedef struct _DownFile {     std::string url;     FILE**   pOfstream; }DownParam, *PDownParam;  size_t my_write_func(void *ptr, size_t size, size_t nmemb, FILE *stream) {     return fwrite(ptr, size, nmemb, stream); }  int tool_progress_cb(void *clientp,     double dltotal,     double dlnow,     double ultotal,     double ulnow) {    // std::cout << dlnow / dltotal*100<<"%"<< std::endl;     return 0; }  void thread_func(PDownParam param) {     CURL *curl = nullptr;     CURLcode res;     curl = curl_easy_init();     if (curl){         curl_easy_setopt(curl, CURLOPT_URL, param->url.c_str());         curl_easy_setopt(curl, CURLOPT_WRITEDATA, *param->pOfstream);         curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_write_func);         curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE);         curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);         curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, tool_progress_cb);         curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 10*1000);         curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 10*1000);         curl_easy_setopt(curl, CURLOPT_VERBOSE, TRUE);//用来在屏幕上显示对服务器相关操作返回的信息         res = curl_easy_perform(curl);         std::cout << curl_easy_strerror(res) << std::endl;         int recode = 0;         curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &recode);         fclose(*param->pOfstream);         curl_easy_cleanup(curl);         curl = nullptr;      } }  int _tmain(int argc, _TCHAR* argv[]) {     curl_global_init(CURL_GLOBAL_WIN32);     FILE* outfile = nullptr;     std::cout << curl_version() << std::endl;     fopen_s(&outfile,"d:\\down", "wb+");     if (outfile){         DownParam param;         param.pOfstream = &outfile;         param.url = durl;         std::thread t = std::thread(thread_func, ¶m);         t.join();     }     curl_global_cleanup();     getchar(); 	return 0; } 将durl define 一个下载链接

user: user-0
content: 嗯 打中了

user: user-0
content: 别沉了。。。。

user: user-6
content: 子弹打中目标了吧。

user: user-0
content: 还是我自己解决了。。。

user: user-0

user: user-8
content: CURL是支持非阻塞传输的，而且还允许并行地进行多个网络请求，其接口主要是以curl_multi为前缀的系列的函数：      CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles); //执行传输   。。。。。。

user: user-0
content: 。。。。。

user: user-6
content: 别急，让子弹飞一会儿。

user: user-0