使用libcurl库进行HTTP的下载
2010-06-03 14:29
369 查看
由于这段时间需要进行跨平台的代码处理,以前写的很多代码都没办法用了.以前用的是win的WinInet库进行HTTP上传和下载的,在Linux下肯定无法使用了,而我又对socket这些东西不是很了解,只能找一些第三方的跨平台库来使用了.不知道出于啥原因,选择了libcurl.然后花了数天时间来了解这个库有关上传下载的东西,可能我的搜索水平有限吧,直到这两天才真正找到一些可供参考的东西.当然我也试着阅读了libcurl的官方文档,但很无奈,英文水平太差,读完后还是不知道该怎么用.
先贴三个对此次学习帮助最大的三个网址吧:
curl官网:http://curl.haxx.se/libcurl/
JGood对libcurl很多函数的官方文档翻译,加了一些实例,很清晰: http://blog.csdn.net/JGood/archive/2009/11/08/4787670.aspx
浪迹天涯对libcurl的一些使用心得,从中我得到了怎么判断HTTP地址的文件是否存在的判断方法:
http://www.cppblog.com/qiujian5628/archive/2008/06/28/54873.html
先说下思路吧:
用curl库,一般步骤为:
先使用curl_global_init()初始化curl,然后使用curl_easy_init()获取curl句柄,再根据得到的句柄进行一些操作设置curl_easy_setopt(),设置完后用curl_easy_peform()执行你以前所做的所有设置.若在设置上做了READ或WRITE等动作,在执行完后还可以用curl_easy_getinfo()来获取你取得的一些东西,这里可以进行一些判断(我就是在这里判断HTTP头,来处理到底远程文件是否存在的).最后就是用curl_easy_cleanup(),curl_global_cleanup()来清理以前初始化的东西.
具体的请看JGod大大的blog.
比较需要了解的还是curl_easy_setopt()的参数:
设置好后就能利用curl进行文件的上传和下载了.
接下来进入主题,上代码:
在外部只要传入url如:http://192.168.1.1/868.txt,和欲存到本地的文件名file_name就行了.
忘了说明了,这目前只是在win下知道怎么用了,linux下还没有编译,等把上传实现了再说.
先贴三个对此次学习帮助最大的三个网址吧:
curl官网:http://curl.haxx.se/libcurl/
JGood对libcurl很多函数的官方文档翻译,加了一些实例,很清晰: http://blog.csdn.net/JGood/archive/2009/11/08/4787670.aspx
浪迹天涯对libcurl的一些使用心得,从中我得到了怎么判断HTTP地址的文件是否存在的判断方法:
http://www.cppblog.com/qiujian5628/archive/2008/06/28/54873.html
先说下思路吧:
用curl库,一般步骤为:
先使用curl_global_init()初始化curl,然后使用curl_easy_init()获取curl句柄,再根据得到的句柄进行一些操作设置curl_easy_setopt(),设置完后用curl_easy_peform()执行你以前所做的所有设置.若在设置上做了READ或WRITE等动作,在执行完后还可以用curl_easy_getinfo()来获取你取得的一些东西,这里可以进行一些判断(我就是在这里判断HTTP头,来处理到底远程文件是否存在的).最后就是用curl_easy_cleanup(),curl_global_cleanup()来清理以前初始化的东西.
具体的请看JGod大大的blog.
比较需要了解的还是curl_easy_setopt()的参数:
curl_easy_setopt(curl, CURLOPT_URL, "http://****"); //获取url地址 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &write_fun); //重载一个写文件的回调函数(默认的只是简单的把数据流输出到屏幕) curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data); //给回调函数传递一个自定义参数data(出现在第4个参数) curl_easy_setopt(curl, CURLOPT_READFUNCTION, &read_fun); curl_easy_setopt(curl, CURLOPT_READDATA, &read_fun); //参见WRITE
设置好后就能利用curl进行文件的上传和下载了.
接下来进入主题,上代码:
//WRITEFUNCTION回调函数的实现,在这里只做简单的处理 size_t process_data(void *buffer, size_t size, size_t nmemb, std::string& user_p) { user_p = (char*)buffer; return nmemb; } const int FILE_EXIST = 200; int down_file(const char* url, const char* down_file_name) { // 初始化libcurl CURLcode return_code; return_code = curl_global_init(CURL_GLOBAL_ALL); if (CURLE_OK != return_code) { cerr << "init libcurl failed." << endl; curl_global_cleanup(); return -1; } // 获取easy handle CURL *easy_handle = curl_easy_init(); if (NULL == easy_handle) { cerr << "get a easy handle failed." << endl; curl_easy_cleanup(easy_handle); curl_global_cleanup(); return -1; } // 设置easy handle属性 return_code = curl_easy_setopt(easy_handle, CURLOPT_URL, url); //设置回调函数 return_code = curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, &process_data); //回调函数的额外参数 std::string connectx; return_code = curl_easy_setopt(easy_handle, CURLOPT_WRITEDATA, &connectx); // 执行数据请求 return_code = curl_easy_perform(easy_handle); //判断获取响应的http地址是否存在,若存在则返回200,400以上则为不存在,一般不存在为404错误 int retcode = 0; return_code = curl_easy_getinfo(easy_handle, CURLINFO_RESPONSE_CODE , &retcode); if (CURLE_OK == return_code && FILE_EXIST == retcode) { double length = 0; return_code = curl_easy_getinfo(easy_handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD , &length); FILE *fp = fopen(save_name.c_str(), "wb+"); fwrite(connectx.c_str(), 1, length, fp); //返回实际写入文本的长度,若不等于length则写文件发生错误. fclose(fp); } else { std::cout << "请求的文件不存在!" << std::endl; curl_easy_cleanup(easy_handle); curl_global_cleanup(); return -1; } // 释放资源 curl_easy_cleanup(easy_handle); curl_global_cleanup(); return 0; }
在外部只要传入url如:http://192.168.1.1/868.txt,和欲存到本地的文件名file_name就行了.
忘了说明了,这目前只是在win下知道怎么用了,linux下还没有编译,等把上传实现了再说.
相关文章推荐
- c++中使用libcurl库进行http网络编程
- libcurl使用HTTP的get请求来下载文件
- (HLS播放器之二)HTTP数据下载之libcurl 基本使用
- 使用libcurl进行文件下载类项目开发(一) libcurl简单使用介绍
- HttpWebRequest 使用NetworkCredential 进行域认证下载时不成功 的解决方案
- 使用libcurl进行邮件的下载与转发
- Android开发使用HttpURLConnection进行网络编程详解【附源码下载】
- 使用HttpUnit进行集成测试
- HttpClient使用post方式模拟表单提交数据到服务器并下载服务器文件
- cocos2d-x lua 使用http(下载图片, POST JSON)
- 使用python基于http下载视频或音频
- 使用Fiddler进行http抓包和调试
- 使用Apache POI WorkBook 进行下载文件的一个问题
- 使用OkHttp包在Android中进行HTTP头处理的教程
- 使用HttpURLConnection从网络中下载图片
- .NET中使用HTTP 进行POST 数据
- SQL Server 2008使用LINQ进行数据访问(转载自IT168 [ http://www.it168.com/ ])
- Xcode5.1离线下载安装及使用iOS5模拟器进行开发调试的方法
- Android中使用Json和Xml与服务器进行通信,使用代码发送Get和Post请求,http请求辅助类
- [转载]使用HttpWebRequest进行请求时发生错误:基础连接已关闭,发送时发生错误处理