浪迹天涯

唯有努力...
努力....再努力...

libcurl使用心得

Libcurl为一个免费开源的,客户端url传输库,支持FTPFTPSTFTPHTTPHTTPSGOPHERTELNETDICTFILELDAP,跨平台,支持WindowsUnixLinux等,线程安全,支持Ipv6。并且易于使用。

http://curl.haxx.se/libcurl/

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的时候,试过好多选项,但未找到这个存放真实服务器文件名的选项,如果有知道的麻烦告诉我,谢谢了!

#include "curl/curl.h"
#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 浪迹天涯 阅读(79447) 评论(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/  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2008年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

常用链接

留言簿(22)

随笔分类(30)

随笔档案(29)

文章分类

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜