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);
//為了在 vi 里看起來完全正常,需要添加換行符和 NULL
}
close (fp);
curl_easy_cleanup(curl);
}
return
0;
}
運行輸出: 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_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;
}
運行輸出: |