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 中从服务器端收到的头部中的 Content-Type 信息。 测试代码:
#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) {
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);
}
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
)
{
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_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
|