CURL--libcurl库使用

目录

前言

一、libcurl库

二、libcurl使用

1.libcurl接口函数介绍

2.读入数据

总结

前言

    Curl是一个命令行工具和库,用于用url传输数据;支持HTTP、HTTPS、FTP、LDAP、DICT、TELNET、SFTP、SCP等多种传输协议,curl提供了一大堆非常有用的功能,包括代理访问、用户认证、ftp上传下载、HTTP POST、SSL连接、cookie支持、断点续传等等。

        curl可以分为命令行工具 和 libcurl库两部分,curl工具可以很好地帮助开发诊断、在终端设备中集成命令行实现数据传输功能;libcurl库是一个客户端URL传输库,提供了很多接口函数,可以用于相关开发。

一、libcurl库

curl官网:https://curl.haxx.se/

curl开源代码:  git clone https://github.com/curl/curl.git

通过makefile文件,编译完成后生成libcurl.so动态库文件,可以在编译过程中链接使用。

二、libcurl使用

1.libcurl接口函数介绍

getparameter()接口用于解析传入的curl命令参数,支持用户自定义参数处理:

ParameterError getparameter(const char *flag, char *nextarg, bool *usedarg, struct GlobalConfig *global, struct OperationConfig *config)
    const char *flag:指向一个字符串,表示当前正在解析的参数标志(例如 --user-agent 或 --timeout)。
    char *nextarg:指向可能包含参数值的字符串。例如,如果 flag 是 --user-agent,nextarg 可能是用户代理的字符串。
    bool *usedarg:指向一个布尔值,指示 nextarg 是否被使用。如果参数不需要额外的值(如开关标志),则 *usedarg 应设置为 false。
    struct GlobalConfig *global:指向全局配置结构体的指针
    struct OperationConfig *config:指向操作配置结构体的指针,参数解析结果存入结构体

Curl_init_userdefined()接口初始化了Curl_easy的用户定义,例如C库读写处理函数fwrite() fread(): 

CURLcode Curl_init_userdefined(struct Curl_easy *data)
  /* use fwrite as default function to store output */
  set->fwrite_func = (curl_write_callback)fwrite;

  /* use fread as default function to read input */
  set->fread_func_set = (curl_read_callback)fread;

通过curl_easy创建CURL句柄,进行网络数据传输相关接口:

//curl指针初始化
CURL *curl_easy_init(void);

//为 CURL 句柄设置各种选项
CURLcode curl_easy_setopt(struct Curl_easy *data, CURLoption tag, ...)
选项设置官方详细说明:
http://curl.se/libcurl/c/curl_easy_setopt.html
常用选项:
CURLOPT_CUSTOMREQUEST  curl请求方法,例如"GET"
CURLOPT_URL  curl请求URL
CURLOPT_TIMEOUT_MS   curl请求超时退出
CURLOPT_WRITEFUNCTION  请求数据写回调处理
CURLOPT_WRITEDATA   数据通过CURLOPT_WRITEFUNCTION回调写入默认定义的文件指针中
CURLOPT_READFUNCTION   读回调处理
CURLOPT_READDATA    通过CURLOPT_READFUNCTION回调读入默认定义的文件指针中
CURLOPT_SSLVERSION    SSL版本
CURLOPT_SSL_CIPHER_LIST   加密套件列表
CURLOPT_SSL_VERIFYPEER    是否验证SSL证书为CA机构签发--自签名证书配置为0
CURLOPT_SSL_VERIFYHOST     SSL 证书中的主机名是否与请求的主机名匹配
CURLOPT_SSL_CTX_FUNCTION   设置自定义的证书、私钥等相关信息的回调函数
CURLOPT_CAINFO   配置证书文件-全路径
CURLOPT_CAPATH   配置证书路径-路径下存放单个证书文件/哈希证书文件

CURLOPT_CONNECTTIMEOUT   连接失败超时退出
CURLOPT_NOSIGNAL  不触发signal信号控制的连接超时

//执行curl请求
CURLcode curl_easy_perform(struct Curl_easy *data)

//转换curlcode为可读错误描述字符串
CURL_EXTERN const char *curl_easy_strerror(CURLcode)

//执行 curl_easy_perform() 完成网络请求之后,调用 curl_easy_getinfo() 来获取请求的相关信息
CURLcode curl_easy_getinfo(struct Curl_easy *data, CURLINFO info, ...)
获取选项说明:
https://curl.se/libcurl/c/curl_easy_getinfo.html
CURLINFO_RESPONSE_CODE  HTTP响应code
CURLINFO_SIZE_DOWNLOAD   上一次传输的下载总量
CURLINFO_SIZE_UPLOAD    上一次上传的下载总量

//释放CURL句柄所占资源
void curl_easy_cleanup(struct Curl_easy *data)

2.读入数据

代码示例:

int main(void) {
    CURL *curl;
    CURLcode res;
    long response_code; // 用于存储响应代码
    FILE* fp = NULL;

    curl = curl_easy_init();
    if(curl) {
        curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET");
        // 设置 HTTPS URL
        curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");

        // 关闭 SSL 证书验证(不推荐在生产环境中使用)
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);

        // 执行请求
        res = curl_easy_perform(curl);
        if(res != CURLE_OK) {
            fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
        }

        res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
        if(res == CURLE_OK) {
            printf("Response Code: %ld\n", response_code);
        }

        // 清理 CURL 句柄
        curl_easy_cleanup(curl);
    }

    return 0;
}


总结

介绍了curl命令参数自定义方法,libcurl库的基本函数接口和使用方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值