博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
curl_easy_getinfo() -- 从 curl 句柄里获得附加信息
阅读量:2194 次
发布时间:2019-05-02

本文共 3397 字,大约阅读时间需要 11 分钟。

http://blog.csdn.net/shenlanzifa/article/details/22731483

curl_easy_getinfo() 函数原型声明如下:

#include <curl/curl.h>
CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ... );

使用该函数可以在请求求 curl 会话中的相关信息。注意,第 3 个参数必须是一个 long 型,或char型,或curl_slist型,抑或是double型的指针。函数所请求信息只有在函数返回 
CURLE_OK 
时才会被有效填充,该函数一般用在 perform 函数(如 curl_easy_perform() )之后。


第 2 个参数有众多选项,每个选项都有其相应的含义:


CURLINFO_SIZE_DOWNLOAD

使用该选项时要求第 3 个参数是个 double 型的指针,这样在一次传输成功后会将本次传输所下载的字节数赋值到指针所指向的 double 型变量中。注意,这个字节数只能反映最近一次的下载。


CURLINFO_SPEED_DOWNLOAD

该选项要求传递一个 double 型参数指针,用以接收下载的平均速度,这个速度不是即时速度,而是下载完成后的速度,单位是 
字节/秒
 。


CURLINFO_TOTAL_TIME

该选项要求传递一个 double 指针到函数中,double 型变量指示了传输的总耗时(单位为秒),这个总的时间里包括了域名解析,以及 TCP 连接过程中所需要的时间。


CURLINFO_CONTENT_TYPE

该选项获得 HTTP 中从服务器端收到的头部中的
 信息。

测试代码

#include <stdio.h>
#include <curl/curl.h>
#include <stdlib.h>
#include <string.h>
 
int
main(
void
)
{
    
CURL *curl;
    
CURLcode res;
 
    
FILE
*fp;
    
if
(!(fp =
fopen
(
"info.html"
,
"w+"
))) {
        
perror
(
"fopen error:"
);
        
exit
(EXIT_FAILURE);
    
}    
 
    
curl = curl_easy_init();
    
if
(curl) {
        
curl_easy_setopt(curl, CURLOPT_URL,
""
);
        
res = curl_easy_perform(curl);
 
        
if
(CURLE_OK == res) {
            
char
*contype;
            
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &contype);
 
            
if
((CURLE_OK == res) && ct)
                
fwrite
(contype, 1,
strlen
(contype), fp);
                
fwrite
(
"\n\0"
, 1, 1, fp);  
//为了在 vi 里看起来完全正常,需要添加换行符和 NULL
        
}
 
        
close (fp);
        
curl_easy_cleanup(curl);
    
}
    
return
0;
}

运行输出:
$ cat info.html 
text/html;charset=gb2312

CURLINFO_FILETIME

使用该选项时需要传递一个 long 型指针到函数,该 long 型变量中保存了远程主机上的文件的最近修改日期。如果使用该值时函数返回 -1,原因是多样的(比如一些未知的,比如服务器对此日期信息做了隐藏,或者是服务器不支持获取文档时间的命令等等)。
需要注意的是
,在使用该选项时,需要先在 curl_easy_setopt() 函数中使用
CURLOPT_FILETIME
 选项,然后再运行 curl_easy_perform() 后,方能获得服务器上的文档时间。


CURLINFO_CONTENT_LENGTH_DOWNLOAD

使用该选项时要求传递一个 double 型指针到函数中,该 double 型变量用来存放所要下载文件(或者是所要查询的文件)的 content-length (文档长度) 的信息。如果文件大小无法获取,那么函数返回值为 -1 。


CURLINFO_FILETIME 和 CURLINFO_CONTENT_LENGTH_DOWNLOAD 选项使用示例,下面代码获取 FTP 服务器上的一个文件的时间和大小信息:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
#include <curl/easy.h>
 
static
size_t
save_header(
void
*ptr,
size_t
size,
size_t
nmemb,
void
*data)
{
        
return
(
size_t
)(size * nmemb);
}
 
int
main(
void
)
{
        
char
ftpurl[] =
""
;
        
CURL *curl;
        
CURLcode res;
 
        
const
time_t
filetime;
        
const
double
filesize;
        
const
char
*filename =
strrchr
(ftpurl,
'/'
) + 1;
 
        
curl_global_init(CURL_GLOBAL_ALL);
 
        
curl = curl_easy_init();
        
if
(curl) {
                
curl_easy_setopt(curl, CURLOPT_URL, ftpurl);
                
curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
                
curl_easy_setopt(curl, CURLOPT_FILETIME, 1L);
                
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, save_header);
                
curl_easy_setopt(curl, CURLOPT_HEADER, 0L);
                
//curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
 
                
curl_easy_perform(curl);
 
                
if
(res != CURLE_OK) {
                        
res = curl_easy_getinfo(curl, CURLINFO_FILETIME, &filetime);
                        
if
((CURLE_OK == res) && filetime)
                                
printf
(
"filetime %s: %s"
, filename,
ctime
(&filetime));
                        
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &filesize);
 
                       
if
((CURLE_OK == res) && (filesize > 0))
                                
printf
(
"filesize %s: %0.0f bytes\n"
, filename, filesize);
                
}
else
{
                        
fprintf
(stderr,
"curl told us %d\n"
, res);
                
}
        
curl_easy_cleanup(curl);
        
}
 
        
curl_global_cleanup();
 
        
return
0;
}


运行输出:
beyes@debian:~/C/curl$ ./getftpinfo 
Last-Modified: Mon, 25 Apr 2011 15:26:56 GMT
Content-Length: 1758
Accept-ranges: bytes
filetime favicon.ico: Mon Apr 25 11:26:56 2011
filesize favicon.ico: 1758 bytes
原文:http://www.groad.net/bbs/thread-3933-1-1.html

你可能感兴趣的文章
深入理解JVM虚拟机1:JVM内存的结构与消失的永久代
查看>>
深入理解JVM虚拟机3:垃圾回收器详解
查看>>
深入理解JVM虚拟机4:Java class介绍与解析实践
查看>>
深入理解JVM虚拟机5:虚拟机字节码执行引擎
查看>>
深入理解JVM虚拟机6:深入理解JVM类加载机制
查看>>
深入了解JVM虚拟机8:Java的编译期优化与运行期优化
查看>>
深入理解JVM虚拟机9:JVM监控工具与诊断实践
查看>>
深入理解JVM虚拟机10:JVM常用参数以及调优实践
查看>>
深入理解JVM虚拟机11:Java内存异常原理与实践
查看>>
深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战
查看>>
深入理解JVM虚拟机13:再谈四种引用及GC实践
查看>>
Spring源码剖析1:Spring概述
查看>>
Spring源码剖析2:初探Spring IOC核心流程
查看>>
Spring源码剖析3:Spring IOC容器的加载过程
查看>>
Spring源码剖析4:懒加载的单例Bean获取过程分析
查看>>
Spring源码剖析5:JDK和cglib动态代理原理详解
查看>>
Spring源码剖析6:Spring AOP概述
查看>>
Spring源码剖析7:AOP实现原理详解
查看>>
Spring源码剖析8:Spring事务概述
查看>>
Spring源码剖析9:Spring事务源码剖析
查看>>