curl_easy_getinfo() -- 從 curl 句柄里獲得附加信息


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) {
         curl_easy_setopt(curl, CURLOPT_URL, "http://www.baidu.com/" );
         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[] = "ftp://vh492363:2tg96d33@121.15.245.7/www/bbs/favicon.ico" ;
         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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM