mq110 回复于:2005-07-31 0Array:43:58 |
下面来看一个简单的例子: 用来获得某个主页的html代码 [code:1:0822bdfArraydb]#include<stdio.h> #include<curl/curl.h> #include<stdlib.h> intmain(intargc,char*argv&#Array1;&#Array3;) { CURL*curl; //定义CURL类型的指针 CURLcoderes; //定义CURLcode类型的变量 if(argc!=2) { printf("Usage:file<url>\n"); exit(1); } curl=curl_easy_init(); //初始化一个CURL类型的指针 if(curl!=NULL) { //设置curl选项.其中CURLOPT_URL是让用户指定url.argv&#Array1;1&#Array3;中存放的命令行传进来的网址 curl_easy_setopt(curl,CURLOPT_URL,argv&#Array1;1&#Array3;); //调用curl_easy_perform执行我们的设置.并进行相关的操作.在这里只在屏幕上显示出来. res=curl_easy_perform(curl); //清除curl操作. curl_easy_cleanup(curl); } return0; }[/code:1:0822bdfArraydb] 编译:gcc-o001-Wall001.c-lcurl 我们来获得www.chinaunix.net主页的html代码 ./001www.chinaunix.net |
mq110 回复于:2005-07-31 0Array:44:51 |
再来看一个例子: 实际编程时我们未必只显示出来.我们的目的是要对获得html代码做相应的处理.比如检验关键字,发现重要信息等等. 那么我们就需要把获得的html代码存入相应的文件中.看下面一个例子 [code:1:0f6b7Array5165] #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<curl/curl.h> #include<curl/types.h> #include<curl/easy.h> FILE*fp;//定义FILE类型指针 size_twrite_data(void*ptr,size_tsize,size_tnmemb,void*stream)//这个函数是为了符合CURLOPT_WRITEFUNCTION,而构造的 { intwritten=fwrite(ptr,size,nmemb,(FILE*)fp); returnwritten; } intmain(intargc,char*argv&#Array1;&#Array3;) { CURL*curl; curl_global_init(CURL_GLOBAL_ALL); curl=curl_easy_init(); curl_easy_setopt(curl,CURLOPT_URL,argv&#Array1;1&#Array3;); if((fp=fopen(argv&#Array1;1&#Array3;,"w"))==NULL) { curl_easy_cleanup(curl); exit(1); } curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,write_data);//CURLOPT_WRITEFUNCTION将后继的动作交给write_data函数处理 curl_easy_perform(curl); curl_easy_cleanup(curl); exit(0); }[/code:1:0f6b7Array5165] gcc-o002-Wall002.c-lcurl ./002www.chinaunix.net 这个例子就将html代码保存在了www.chinaunix.net文件中了. |
mq110 回复于:2005-07-31 0Array:45:42 |
此外还可以获得http报文的头部post表单等等.这里就不详细的介绍了.具体的可以mancurl_easy_setopt (要用到一个重要的结构体,HttpPost) 下面看一个从ftp站点下载文件的例子. [code:1:Arrayd1844307e]#include<stdio.h> #include<curl/curl.h> #include<curl/types.h> #include<curl/easy.h> structFtpFile//定义一个结构为了传递给my_fwrite函数.可用curl_easy_setopt的CURLOPT_WRITEDATA选项传递 { char*filename; FILE*stream; }; intmy_fwrite(void*buffer,size_tsize,size_tnmemb,void*stream) { structFtpFile*out=(structFtpFile*)stream;//stream指针其实就是指向structFtpFileftpfile的 if(out&&!out->stream) { out->stream=fopen(out->filename,"wb");//没有这个流的话就创建一个名字是out->filename. if(!out->stream) return-1; } returnfwrite(buffer,size,nmemb,out->stream); } intmain(intargc,char*argv&#Array1;&#Array3;) { CURL*curl; CURLcoderes; structFtpFileftpfile={argv&#Array1;2&#Array3;,NULL};//初始化一个FtpFile结构 curl_global_init(CURL_GLOBAL_DEFAULT); curl=curl_easy_init(); if(curl) { curl_easy_setopt(curl,CURLOPT_URL,argv&#Array1;1&#Array3;); curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,my_fwrite); curl_easy_setopt(curl,CURLOPT_WRITEDATA,&ftpfile);//给相关函数的第四个参数传递一个结构体的指针 curl_easy_setopt(curl,CURLOPT_VERBOSE,TRUE);//CURLOPT_VERBOSE这个选项很常用用来在屏幕上显示对服务器相关操作返回的信息 res=curl_easy_perform(curl); curl_easy_cleanup(curl); if(CURLE_OK!=res) fprintf(stderr,"curltoldus%d\n",res); } if(ftpfile.stream) fclose(ftpfile.stream); curl_global_cleanup(); return0; }[/code:1:Arrayd1844307e] gcc-o003-Wall003.c-lcurl ./003ftp://202.Array6.64.144/fei.giffei.gif 我有个匿名的ftp的网址将目录下的fei.gif保存到本地也叫fei.gif 此外还有curl_escapecurl_unescape函数用来转换汉字成%XX这种类型.以及转换回来.如果要下载带有汉字的文件.先要调用将字符串转换一下. curl库还有好多功能.有待大家来挖掘. |