曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 13378|回复: 0
打印 上一主题 下一主题

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

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2011-6-30 10:53:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
curl_easy_getinfo() 函数原型声明如下:
[C++] 纯文本查看 复制代码
#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 信息。
测试代码
[C++] 纯文本查看 复制代码
#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 服务器上的一个文件的时间和大小信息:
[C++] 纯文本查看 复制代码
#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
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-9 18:53 , Processed in 0.063298 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表