介绍
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_POSTFIELDS和CURLOPT_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