libcurl 使用说明

curl_easy_setopt(curl, XXX, xxx);
设置curl的相关内容功能
1.CURLOPT_URL
设置访问URL
2.CURLOPT_WRITEFUNCTION
设置回调函数,执行libcurl在接受到数据后用户想进行的操作,通常函数多做数据保存的功能,如处理下载文件。回调函数的原型size_t function( void *ptr, size_t size, size_t nmemb, void *stream);
3.CURLOPT_WRITEDATA
CURLOPT_WRITEDATA 用于表明CURLOPT_WRITEFUNCTION函数中的stream指针的来源,说白了就是设定回调函数的第四个参数的数据类型。
4.CURLOPT_TIMEOUT
设置传输时间

libcurl 同时支持http,smtp,ftp,tftp,ssh,telnet等协议,ssl,rtsp 安全相关配置。
具体配置相关选项连接:
https://blog.csdn.net/xj9120/article/details/97250438

libcurl 打印数据头信息实例:

#include <stdio.h>
#include <curl/curl.h>
#include <stdlib.h>
#include <string.h>

struct MemoryStruct {
    char* memory;
    size_t allsize;
};

static size_t WriteMemoryCallback(void* contents, size_t _size, size_t nmemb, void* userp)
{
    size_t realsize = _size * nmemb;
    struct MemoryStruct *mem = (struct MemoryStruct*)userp;

    mem->memory = (char*)realloc(mem->memory, mem->allsize + realsize + 1);
    if(mem->memory == NULL){
        printf("realloc error...\n");
        return 0;
    }

    memcpy(&(mem->memory[mem->allsize]), contents, realsize);
    mem->allsize += realsize;
    mem->memory[mem->allsize] = 0;

    return realsize;
}


size_t write_data(char* buffer, size_t size, size_t items, void* outstream)
{
    int written = fwrite(buffer, size, items, (FILE*)(outstream));
    return written;
}

double get_download_size(char* url){
    CURL* curl;
    CURLcode res;
    double size = 0.0;
    int httpcode=0;
    FILE* fd = fopen("./aaa.txt", "wb+");
    char *type = (char*)malloc(32);
    struct MemoryStruct chunk;
    chunk.memory = (char*)malloc(1);
    chunk.allsize = 0;



    curl = curl_easy_init();
    curl_easy_setopt(curl, CURLOPT_URL, url);
    //curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 0);    //不跳转
    curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 3000);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)fd);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);

    curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteMemoryCallback);
    curl_easy_setopt(curl, CURLOPT_HEADERDATA, (void*)&chunk);

    res = curl_easy_perform(curl);
    if(res != CURLE_OK){
        fprintf(stderr, "curl_easy_getinfo() failed: %s\n", curl_easy_strerror(res));
    }
    res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpcode);
    if(res != CURLE_OK || httpcode != 200 ){
        fprintf(stdout, "httpcode error!\n");        
    }
    //获得download数据的大小
    res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &size);
    if(res != CURLE_OK ){
        fprintf(stdout, "httpcode xxxerror!\n");        
    }

    res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &type);
    if(res != CURLE_OK ){
        fprintf(stdout, "TYPE xxxerror!\n");        
    }
    printf("type:\n%s\n", type);
    printf("header:\n%s\n", chunk.memory);
    fclose(fd);
    free(chunk.memory);    
    curl_easy_cleanup(curl);

    return size;
}

int main(int argc, char* argv[])
{
    char url[] = "https://baidu.com";

    double filesize = get_download_size(url);
    printf("[%0.0lf] %s\n", filesize, url);
    return 0;
}

参考文献

这是一篇初级使用写的比较细的文章
https://www.cnblogs.com/heluan/p/10177475.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值