libcurl使用心得
Libcurl为一个免费开源的,客户端url传输库,支持FTP,FTPS,TFTP,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE和LDAP,跨平台,支持Windows,Unix,Linux等,线程安全,支持Ipv6。并且易于使用。
从http://curl.haxx.se/libcurl/ 下载一个稳定的版本,注意选择OS。
在使用之前请大家多阅读libcurl的文档:因为如果要实际运用到项目中,最好对libcurl有具体的了解,具体在
http://curl.haxx.se/libcurl/c/
curl_easy_setopt()
curl_easy_perform()
curl_easy_getinfo()
这三个函数的使用上,需要多去钻研,多看Samples,你才能灵活使用libcurl。
感谢这篇文章:
http://blog.163.com/xu_chao2000/blog/static/27770610200801303252802/
给了我许多启发,再次感谢!
给出我的一个简单的代码例子:
说明:
1.关键在curl_easy_setopt函数设置option,可以设置ftp,http,get,post等许多选项,请根据具体使用情况设置。
2.对取回来的数据需要进行判断,比如http下载文件,如果文件不存在,需要进行处理。因为writer是可以将buf填充404 not found等网页内容的,不能将这个内容当成文件内容,所以需要判断http web返回来的code,进行判断。
3.我有个问题,就是想得到服务器上filename的具体名称,verbose调试已经返回了,但是我在getinfo的时候,试过好多选项,但未找到这个存放真实服务器文件名的选项,如果有知道的麻烦告诉我,谢谢了!
#pragma comment(lib, " libcurl.lib " )
long writer(void * data, int size, int nmemb, string & content);
bool CurlInit(CURL *& curl, const char* url,string & content);
bool GetURLDataBycurl(const char* URL, string & content);
void main()
{
char *url ="http://www.baidu.com/img/baidu.gif";
string content;
if ( GetURLDataBycurl(url,content))
{
printf("%s\n",content);
}
getchar();
}
bool CurlInit(CURL *& curl, const char* url,string & content)
{
CURLcode code;
string error;
curl = curl_easy_init();
if (curl == NULL)
{
printf( "Failed to create CURL connection\n");
return false;
}
code = curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error);
if (code != CURLE_OK)
{
printf( "Failed to set error buffer [%d]\n", code );
return false;
}
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
code = curl_easy_setopt(curl, CURLOPT_URL, url);
if (code != CURLE_OK)
{
printf("Failed to set URL [%s]\n", error);
return false;
}
code = curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
if (code != CURLE_OK)
{
printf( "Failed to set redirect option [%s]\n", error );
return false;
}
code = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
if (code != CURLE_OK)
{
printf( "Failed to set writer [%s]\n", error);
return false;
}
code = curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content);
if (code != CURLE_OK)
{
printf( "Failed to set write data [%s]\n", error );
return false;
}
return true;
}
long writer(void * data, int size, int nmemb, string & content)
{
long sizes = size * nmemb;
string temp(data,sizes);
content += temp;
return sizes;
}
bool GetURLDataBycurl(const char* URL, string & content)
{
CURL *curl = NULL;
CURLcode code;
string error;
code = curl_global_init(CURL_GLOBAL_DEFAULT);
if (code != CURLE_OK)
{
printf( "Failed to global init default [%d]\n", code );
return false;
}
if ( !CurlInit(curl,URL,content) )
{
printf( "Failed to global init default [%d]\n" );
return PM_FALSE;
}
code = curl_easy_perform(curl);
if (code != CURLE_OK)
{
printf( "Failed to get '%s' [%s]\n", URL, error);
return false;
}
long retcode = 0;
code = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE , &retcode);
if ( (code == CURLE_OK) && retcode == 200 )
{
double length = 0;
code = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD , &length);
printf("%d",retcode);
FILE * file = fopen("1.gif","wb");
fseek(file,0,SEEK_SET);
fwrite(content.c_str(),1,length,file);
fclose(file);
//struct curl_slist *list;
//code = curl_easy_getinfo(curl,CURLINFO_COOKIELIST,&list);
//curl_slist_free_all (list);
return true;
}
else
{
// debug1( "%s \n ",getStatusCode(retcode));
return false;
}
curl_easy_cleanup(curl);
return false;
}
posted on 2008-06-28 14:50 浪迹天涯 阅读(55881) 评论(18) 编辑 收藏 引用 所属分类: Lib
评论
# re: libcurl使用心得 2008-06-28 15:42 LOGOS
看起来能用来做蜘蛛 回复 更多评论
# re: libcurl使用心得 2008-06-28 16:00 浪迹天涯
有用这个写爬虫的 回复 更多评论
# re: libcurl使用心得 2008-07-01 12:48 企业即时通讯
太厉害了。哈哈。 回复 更多评论
# re: libcurl使用心得 2009-09-04 23:07 紫枫闲人
支持楼主,感谢分享,帮了大忙了。 回复 更多评论
# re: libcurl使用心得 2009-09-09 18:55 druselyy
多线程的效果怎么样 回复 更多评论
# re: libcurl使用心得 2010-08-02 12:10 ShereeHamilton22
I think that to get the <a href="http://bestfinance-blog.com/topics/personal-loans">personal loans</a> from creditors you must have a good reason. Nevertheless, one time I have got a student loan, because I wanted to buy a building. 回复 更多评论
# re: libcurl使用心得 2010-08-22 13:49 able
楼主的代码高亮工具我一直没找到
不知道楼主方便传一份不 谢过
mail: 645989637@qq.com 回复 更多评论
# re: libcurl使用心得 2011-03-23 09:45 aaa
楼主你确信你的可用么,代码很有问题啊。。。。 回复 更多评论
# re: libcurl使用心得[未登录] 2012-02-03 17:41 rock
经检查运行测试, 无法得到结果,显示错误:
Failed to get ="http://www.baidu.com/img/baidu.gif" []
回复 更多评论
# re: libcurl使用心得[未登录] 2012-02-03 18:11 rock
运行正确,是我错了,不好意思! 回复 更多评论
# re: libcurl使用心得 2012-04-04 23:03 小宁
楼主CURL代码不能用于断点续传
楼主如果想得到服务器上的文件名可以在响应头中提取
希望能和使用LIBCURL的同学一起交流下
QQ群49184341 回复 更多评论
# re: libcurl使用心得 2012-05-10 19:42 北漂一时
@druselyy多线程效果并没有multi handle效果好。原因是多线程之间还存在线程的切换,而multi handle是批处理,接收数据后一次性全部写入,不用像多线程一样在多个文件之家来回移动磁头——其实这个是比较耗时的。
回复 更多评论
# re: libcurl使用心得 2012-05-23 16:02 珍
在多线程中调用easy handle, POST数据时,有时根本发不出数据是怎么回事?总是有丢数据包的现象发生,请问各位高手怎么解决? 回复 更多评论
# re: libcurl使用心得 2012-11-15 10:30 P2P下载
谢谢分享 回复 更多评论
# re: libcurl使用心得[未登录] 2013-04-03 21:46 刘伟
如果网页中有中文呢?我这边调试的是乱码,该如何处理呢? 回复 更多评论
# re: libcurl使用心得[未登录] 2013-12-06 15:18 曾是土木人
不错,对我使用libcurl挺有帮助的,感谢博主的分享精神! 回复 更多评论
# re: libcurl使用心得[未登录] 2013-12-11 19:07 lin
谢谢博主,参考你的例程成功下载到了文件。万分感谢博主的分享精神。 回复 更多评论
# re: libcurl使用心得 2014-10-24 13:51 da
http://www.seanyxie.com/libcurl%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95/ 回复 更多评论