curl_easy_getinfo() -- 从 curl 句柄里获得附加信息

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值