一个使用libcurl发生阻塞的问题

「已注销」 2014-05-27 04:49:54
printf("Create bucket start...\n");
CURL *curl;
CURLcode code;

curl=curl_easy_init();

curl_easy_setopt(curl,CURLOPT_URL,url);
curl_easy_setopt(curl,CURLOPT_TIMEOUT,3);
curl_easy_setopt(curl,CURLOPT_PUT,1);

code=curl_easy_perform(curl);
// printf("%d\n",code);
if(code == 0)
{
printf("create bucket success.\n");
}

curl_easy_cleanup(curl);

return 0;
代码如上所示,代码执行到code=curl_easy_perform(curl);这一句的时候这个函数一直没有返回code,导致无法判断命令是否执行成功,还望各位大神指点一二。
...全文
1654 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
小型战斗机 2016-05-20
  • 打赏
  • 举报
回复
楼主是怎么解决的,同求
L--黑色柳丁--R 2016-04-06
  • 打赏
  • 举报
回复
我遇到了和楼主同样的问题,尝试了多种方式都没能解决,无奈之下只能求救于楼主,请问楼主你是用什么方法解决的。
ruilove_555 2016-02-02
  • 打赏
  • 举报
回复
我也遇到过这个问题,我用的是easy模式。 我的解决方案是在回调函数中做处理: 具体方法就是在回调函数中判断下载前后的文件大小,如果相同就看相同的时间(自己设置超时时长)。超时直接返回,libcurl就会返回
侯壮壮 2016-02-02
  • 打赏
  • 举报
回复
在return 0 之前加一个sleep(5);
woshiyujia 2015-07-08
  • 打赏
  • 举报
回复
我是基于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!所以很困惑,不知道超时到底有没有效果,求助各位大神啊
赵4老师 2015-07-07
  • 打赏
  • 举报
回复
使用多进程调用libcurl 参考《Unix编程艺术》
woshiyujia 2015-07-07
  • 打赏
  • 举报
回复
前辈~初学libcurl,也遇到这个问题!设置了超时,但是curl_easy_perform还是一直阻塞,请指教
hlx_beat 2015-07-07
  • 打赏
  • 举报
回复

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 一个下载链接
「已注销」 2014-05-31
  • 打赏
  • 举报
回复
嗯 打中了
「已注销」 2014-05-30
  • 打赏
  • 举报
回复
别沉了。。。。
赵4老师 2014-05-30
  • 打赏
  • 举报
回复
子弹打中目标了吧。
「已注销」 2014-05-30
  • 打赏
  • 举报
回复
还是我自己解决了。。。
「已注销」 2014-05-29
  • 打赏
  • 举报
回复
帅得不敢出门 2014-05-28
  • 打赏
  • 举报
回复
CURL是支持非阻塞传输的,而且还允许并行地进行多个网络请求,其接口主要是以curl_multi为前缀的系列的函数: CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles); //执行传输 。。。。。。
「已注销」 2014-05-28
  • 打赏
  • 举报
回复
。。。。。
赵4老师 2014-05-28
  • 打赏
  • 举报
回复
别急,让子弹飞一会儿。
「已注销」 2014-05-28
  • 打赏
  • 举报
回复

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧