• 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>
     
    intmain(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(" ", 1, 1, fp);  //为了在 vi 里看起来完全正常,需要添加换行符和 NULL
            }
     
            close (fp);
            curl_easy_cleanup(curl);
        }
        return0;
    }

    运行输出:
    $ 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>
     
    staticsize_t save_header(void*ptr, size_tsize, size_tnmemb, void*data)
    {
            return(size_t)(size * nmemb);
    }
     
    intmain(void)
    {
            CURL *curl;
            CURLcode res;
     
            consttime_t filetime;
            constdouble filesize;
            constchar *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 ", filename, filesize);
                    }else{
                            fprintf(stderr, "curl told us %d ", res);
                    }
            curl_easy_cleanup(curl);
            }
     
            curl_global_cleanup();
     
            return0;
    }


    运行输出:
    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
  • 相关阅读:
    一些算法思路整理
    (递归描述)根据上排给出十个数,在其下排填出对应的十个数
    在二元树中找出和为某一值的所有路径(树)--最容易理解的版本?
    动态规划求解连续子数组最大和问题(应该是新的描述方法?)
    ubuntu/linux 下 git 通过代理下载数据 (最简单的方式)
    3. Longest Substring Without Repeating Characters(c++) 15ms
    1.Two Sum(c++)(附6ms O(n) accepted 思路和代码)
    3篇NeuroImage文献分析
    PCA、ZCA白化
    mysql创建全文索引
  • 原文地址:https://www.cnblogs.com/shenlanzifa/p/5288769.html
Copyright © 2020-2023  润新知