curl库的用法

介绍

libcurl作为是一个多协议的便于客户端使用的URL传输库,基于C语言,提供C语言的API接口,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet and TFTP这些协议,同时支持使用SSL证书的安全文件传输:HTTP POST, HTTP PUT, FTP 上传, 基于HTTP形式的上传、代理、Cookies、用户加密码的认证等多种应用场景。另外,libcurl是一个高移植性的库,能在绝大多数系统上运行,包括Solaris, NetBSD, FreeBSD, OpenBSD, Darwin, HPUX, IRIX, AIX, Tru64, Linux, UnixWare, HURD, Windows, Amiga, OS/2, BeOs, Mac OS X, Ultrix, QNX, OpenVMS, RISC OS, Novell NetWare, DOS等。

 

使用流程

函数说明

1. curl_global_init

CURLcode curl_global_init(long flags);

描述:该函数只能用一次,但在调用curl_global_cleanup 函数后仍可再用。若该函数没有在调用curl_easy_init函数前调用,其会被libcurl自动调用。so多线程下,应主动调用该函数,以免在线程中执行curl_easy_init函数前被libcurl多次自动调用。

注意:libcurl是线程安全的,但curl_global_init是不能保证线程安全的。因此需在主线程调用该函数,而不是在每个线程中调用。

参数:flags值的解释如下

CURL_GLOBAL_ALL                      //初始化所有的可能的调用。
CURL_GLOBAL_SSL                      //初始化支持 安全套接字层。
CURL_GLOBAL_WIN32            //初始化win32套接字库。
CURL_GLOBAL_NOTHING         //没有额外的初始化。

2. curl_easy_init

CURL *curl_easy_init( );

描述:curl_easy_init用来初始化一个CURL的指针(curl的所有操作就是围绕该指针进行). 相应的在调用结束时要用curl_easy_cleanup函数清理.

注意:一般curl_easy_init意味着一个会话的开始. 它会返回一个easy_handle(CURL*对象), 一般都用在easy系列的函数中。

3. curl_easy_setopt

//设置请求的url【这是唯一要求必须设置的选项,不然咋知道是向谁请求或发送数据】
// Even if you set a crazy value here, curl_easy_setopt will still return CURLE_OK.
// 该url相当于浏览器输入的地址,如果可以带文件,执行后就可以下载文件
curl_easy_setopt(curl_handler, CURLOPT_URL, url);

//设置是否返回请求头
// 设置的值为1,意味要返回请求头;0表示不返回。无其他值
curl_easy_setopt(curl_handler, CURLOPT_HEADER, 1L);

//设置屏蔽其他信号
curl_easy_setopt(curl_handler, CURLOPT_NOSIGNAL, 1L);

//设置下载数据回调函数
// 若置为NULL,则其默认值为fwrite
/*
回调函数原型:
    size_t function( void *ptr, size_t size, size_t nmemb, void *userp);
        函数将在libcurl接收到数据后被调用。
        void *ptr是下载回来的数据.
        void *userp是用户指针, 用户通过这个指针传输自己的数据.
CURLOPT_WRITEDATA:设置回调函数中的void *userp指针的来源。
*/
curl_easy_setopt(curl_handler, CURLOPT_WRITEFUNCTION, write_func);
// 如果设置这个值,则必须怼个CURLOPT_WRITEFUNCTION,否则会崩溃
// If you're using libcurl as a win32 DLL, you MUST use a CURLOPT_WRITEFUNCTION if you set this option or you will experience crashes.
curl_easy_setopt(curl_handler, CURLOPT_WRITEDATA, write_data);


//设置是否使用下载进度控制函数
// 为0,表示把下载进度显示在控制台;为1,表示不显示下载进度
curl_easy_setopt(curl_handler, CURLOPT_NOPROGRESS, 0L);
curl_easy_setopt(curl_handler, CURLOPT_PROGRESSFUNCTION, prog_func);
curl_easy_setopt(curl_handler, CURLOPT_PROGRESSDATA, pdata);
// 下载进度回调函数与下载数据的回调函数原型相同,data也相同。

//设置请求头
struct curl_list *header_list = NULL;
header_list = curl_slist_append(header_list, headers);

curl_easy_setopt(curl_handler, CURLOPT_HTTPHEADER, header_list);
curl_slist_free_all(header_list);

//其他选项
     CURLOPT_HEADERFUNCTION
// 只取HTTP头部数据, 处理与下载数据回调的处理相同. 
     CURLOPT_HEADERDATA
// 超时时间
     CURLOPT_TIMEOUT
//   连接等待时间.
     CURLOPT_CONNECTIONTIMEOUT   
// 设置支持302重定向
     CURLOPT_FOLLOWLOCATION
// 断点续传, 指定传输分片, 格式:"0-200"    
   CURLOPT_RANGE

描述:该函数可以设置访问url的属性,具体设置可看libcurl官网介绍:https://curl.haxx.se/libcurl/c/

注:如果设置Post方式发送数据,则需要设置 CURLOPT_POSTFIELDSCURLOPT_POSTFIELDSIZE 

PS:若需要复制该设置的属性,调用curl_easy_duphandle.若需要清空之前设置的属性,可以调用curl_easy_reset

4. curl_easy_perform

CURLcode curl_easy_perform(CURL *handler);

描述:执行当次请求创建的句柄,在curl_easy_setopt完成后调用,执行我们设置的option。返回值可以从官网中获取意义:https://curl.haxx.se/libcurl/c/libcurl-errors.html

5. curl_easy_cleanup

void curl_easy_cleanup(CURL *handler);

描述: 用来结束一个会话.与curl_easy_init配合着用. 

6. curl_global_cleanup

void curl_global_cleanup();

描述:销毁全局执行环境。

注意:libcurl是线程安全的,但curl_global_cleanup是不能保证线程安全的。因此需在主线程调用该函数,而不是在每个线程中调用。

注意事项

若build工程时发现如下链接错误时:

解决方法如下图所示配置:

Ws2_32.lib Wldap32.lib

参考:https://blog.csdn.net/u010487568/article/details/52958367
https://blog.csdn.net/byxdaz/article/details/81869881

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值