<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[[精华转贴]curl c/c++ api接口使用例程 ]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Wed, 05 Oct 2011 05:24:35 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	curl c/c++ api接口使用例程 <br/><br/>来源：http://bbs.chinaunix.net/viewthread.php?tid=586014<br/>前两天看到有人求客户端socket 发HTTP包的代码，受flw版主启发找了一些perl的资料，不过对perl 还是不太熟悉。也没有深入的 研究。无意中发现了libcurl.so 这个库。去google上搜索发现它是处理客户端发送HTTP请求的库 以及可以处理web服务器回送回来的 包。研究了两天将研究的成果，共享出来给大家一起研究。 <br/>参考：http://curl.haxx.se/&nbsp;&nbsp;这是curl开发者的首页。 <br/>利用libcurl.so库 我们能轻松的连接某个web站点。获得某个首页的html代码 或者是http 请求的头部。 还可以提交表单， <br/>此外它还支持ftp,https, <br/>/usr/include/curl/curl.h 中。 <br/>1 CURLcode curl_global_init(long flags); <br/>描述： <br/>这个函数只能用一次。(其实在调用curl_global_cleanup 函数后仍然可再用) <br/>如果这个函数在curl_easy_init函数调用时还没调用，它讲由libcurl库自动完成。 <br/>参数：flags <br/>CURL_GLOBAL_ALL&nbsp;&nbsp;&nbsp;&nbsp;//初始化所有的可能的调用。 <br/>CURL_GLOBAL_SSL&nbsp;&nbsp;&nbsp;&nbsp;//初始化支持 安全套接字层。 <br/>CURL_GLOBAL_WIN32&nbsp;&nbsp;//初始化win32套接字库。 <br/>CURL_GLOBAL_NOTHING&nbsp;&nbsp;&nbsp;&nbsp; //没有额外的初始化。 <br/>2 void curl_global_cleanup(void); <br/>描述：在结束libcurl使用的时候，用来对curl_global_init做的工作清理。类似于close的函数。 <br/>3 char *curl_version( ); <br/>描述: 打印当前libcurl库的版本。 <br/>4 CURL *curl_easy_init( ); <br/>描述: <br/>curl_easy_init用来初始化一个CURL的指针(有些像返回FILE类型的指针一样). 相应的在调用结束时要用curl_easy_cleanup函数清理. <br/>一般curl_easy_init意味着一个会话的开始. 它的返回值一般都用在easy系列的函数中. <br/>5&nbsp;&nbsp;void curl_easy_cleanup(CURL *handle); <br/>描述: <br/>这个调用用来结束一个会话.与curl_easy_init配合着用.&nbsp;&nbsp;<br/>参数: <br/>CURL类型的指针. <br/>6&nbsp;&nbsp;CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter); <br/>描述: 这个函数最重要了.几乎所有的curl 程序都要频繁的使用它. <br/>它告诉curl库.程序将有如何的行为. 比如要查看一个网页的html代码等. <br/>(这个函数有些像ioctl函数) <br/>参数: <br/>1 CURL类型的指针 <br/>2 各种CURLoption类型的选项.(都在curl.h库里有定义,man 也可以查看到) <br/>3 parameter 这个参数 既可以是个函数的指针,也可以是某个对象的指针,也可以是个long型的变量.它用什么这取决于第二个参数. <br/>CURLoption 这个参数的取值很多.具体的可以查看man手册. <br/>7 CURLcode curl_easy_perform(CURL *handle); <br/>描述:这个函数在初始化CURL类型的指针 以及curl_easy_setopt完成后调用. 就像字面的意思所说perform就像是个舞台.让我们设置的 <br/>option 运作起来. <br/>参数: <br/>CURL类型的指针.<br/> 下面来看一个简单的例子: <br/>用来获得某个主页的html代码 <br/>#include &lt;stdio.h&gt;;<br/>#include &lt;curl/curl.h&gt;;<br/>#include &lt;stdlib.h&gt;;<br/>int main(int argc, char *argv[])<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;CURL *curl;&nbsp;&nbsp; //定义CURL类型的指针<br/>&nbsp;&nbsp;&nbsp;&nbsp;CURLcode res;&nbsp;&nbsp;//定义CURLcode类型的变量<br/>&nbsp;&nbsp;&nbsp;&nbsp;if(argc!=2)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Usage : file &lt;url&gt;;&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl = curl_easy_init(); //初始化一个CURL类型的指针<br/>&nbsp;&nbsp;&nbsp;&nbsp;if(curl!=NULL)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/> //设置curl选项. 其中CURLOPT_URL是让用户指定url. argv[1]中存放的命令行传进来的网址<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_easy_setopt(curl, CURLOPT_URL, argv[1]); <br/> //调用curl_easy_perform 执行我们的设置.并进行相关的操作. 在这里只在屏幕上显示出来.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res = curl_easy_perform(curl);<br/> //清除curl操作.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_easy_cleanup(curl);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br/>&#125;<br/>编译: gcc -o 001 -Wall 001.c -lcurl <br/>我们来获得www.chinaunix.net 主页的html代码 <br/>./001 www.chinaunix.net<br/>再来看一个例子: <br/>实际编程时 我们未必只显示出来.我们的目的是要对获得html代码做相应的处理.比如检验关键字,发现重要信息等等. <br/>那么我们就需要把获得的html代码存入相应的文件中.看下面一个例子 <br/>#include &lt;stdio.h&gt;;<br/>#include &lt;stdlib.h&gt;;<br/>#include &lt;unistd.h&gt;;<br/>#include &lt;curl/curl.h&gt;;<br/>#include &lt;curl/types.h&gt;;<br/>#include &lt;curl/easy.h&gt;;<br/>FILE *fp;&nbsp;&nbsp;//定义FILE类型指针<br/>size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)&nbsp;&nbsp;//这个函数是为了符合CURLOPT_WRITEFUNCTION, 而构造的<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;int written = fwrite(ptr, size, nmemb, (FILE *)fp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;return written;<br/>&#125;<br/>int main(int argc, char *argv[])<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;CURL *curl;<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_global_init(CURL_GLOBAL_ALL);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl=curl_easy_init();<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_easy_setopt(curl, CURLOPT_URL, argv[1]);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if((fp=fopen(argv[1],&quot;w&quot;))==NULL)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_easy_cleanup(curl);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);&nbsp;&nbsp;//CURLOPT_WRITEFUNCTION 将后继的动作交给write_data函数处理<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_easy_perform(curl);<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_easy_cleanup(curl);<br/>&nbsp;&nbsp;&nbsp;&nbsp;exit(0);<br/>&#125;<br/>gcc -o 002 -Wall 002.c -lcurl <br/>./002 www.chinaunix.net <br/>这个例子就将html代码保存在了www.chinaunix.net文件中了.<br/>此外还可以获得http报文的头部 post表单 等等. 这里就不详细的介绍了. 具体的可以man curl_easy_setopt <br/>(要用到一个重要的结构体,HttpPost) <br/>下面看一个从ftp站点下载文件的例子. <br/>#include &lt;stdio.h&gt;;<br/>#include &lt;curl/curl.h&gt;;<br/>#include &lt;curl/types.h&gt;;<br/>#include &lt;curl/easy.h&gt;;<br/>struct FtpFile&nbsp;&nbsp; //定义一个结构为了传递给my_fwrite函数.可用curl_easy_setopt的CURLOPT_WRITEDATA选项传递<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *filename;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILE *stream;<br/>&#125;;<br/>int my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct FtpFile *out=(struct FtpFile *)stream;&nbsp;&nbsp;// stream指针其实就是 指向struct FtpFile ftpfile的<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(out &amp;&amp; !out-&gt;;stream)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out-&gt;;stream=fopen(out-&gt;;filename, &quot;wb&quot;); //没有这个流的话就创建一个 名字是out-&gt;;filename.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!out-&gt;;stream)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return fwrite(buffer, size, nmemb, out-&gt;;stream);<br/>&#125;<br/>int main(int argc, char *argv[])<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CURL *curl;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CURLcode res;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct FtpFile ftpfile=&#123;argv[2],NULL&#125;;&nbsp;&nbsp;//初始化一个FtpFile结构 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_global_init(CURL_GLOBAL_DEFAULT);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl = curl_easy_init();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(curl)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_easy_setopt(curl, CURLOPT_URL,argv[1]);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_easy_setopt(curl, CURLOPT_WRITEDATA, &amp;ftpfile);&nbsp;&nbsp;//给相关函数的第四个参数 传递一个结构体的指针<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_easy_setopt(curl, CURLOPT_VERBOSE, TRUE);&nbsp;&nbsp;//CURLOPT_VERBOSE 这个选项很常用 用来在屏幕上显示对服务器相关操作返回的信息<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res = curl_easy_perform(curl);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_easy_cleanup(curl);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(CURLE_OK != res)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr, &quot;curl told us %d&#92;n&quot;, res);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(ftpfile.stream)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(ftpfile.stream);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_global_cleanup();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br/>&#125;<br/>gcc -o 003 -Wall 003.c -lcurl <br/>./003&nbsp;&nbsp;ftp://202.96.64.144/fei.gif&nbsp;&nbsp;&nbsp;&nbsp;fei.gif <br/>我有个匿名的ftp的网址 将目录下的fei.gif 保存到本地 也叫fei.gif <br/>此外还有curl_escape curl_unescape函数用来转换 汉字成 %XX 这种类型.以及转换回来.如果要下载带有汉字的文件.先要调用将字符串转换一下. <br/>curl 库 还有好多功能. 有待大家来挖掘.<br/>说明：在gcc编译的时候记得加上 -lcurl
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [精华转贴]curl c/c++ api接口使用例程 ]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>