liunx - libcurl

liunx - libcurl

1. 基本介绍

libcurl 是一个免费且易于使用的客户端 URL 传输库,支持 DICT、FILE、FTP、FTPS、GOPHER、GOPHERS、HTTPS、IMAP、IMAPS、LDAP、LDAPS、MQTT、POPP3、POP3S、RTMP、RTMPS、RTSP、SCP、SFTP、SMB、SMBS、SMTP、SMTPS、TELNET 和 TFTP。libcurl 支持 SSL 证书、HTTP POST、HTTP PUT、
FTP 上传、基于 HTTP 表单的上传、代理、HTTP/2、HTTP/3、cookie、用户+密码身份验证(基本、摘要、NTLM、协商、Kerberos)、文件传输恢复、http 代理隧道等等!

官网 : libcurl
curl版本 :curl-7.71.1.tar.gz 下载地址 https://curl.se/download/
openssl :openssl-1.1.1c.tar.gz 下载命令 wget https://www.openssl.org/source/openssl-1.1.1c.tar.gz

2. 安装

libcurl

  1. ./configure --prefix=$PWM/_install --with-ssl (perfix 填写路径 , withd-ssl 支持 ssl)
  2. make
  3. sudo make install
    只要没有error 且目录出现 _install 就表示安装成功 ,如果出现错误可能是 openssl 没有安装

openssl

  • ./config
  • make
  • sudo make install

3. 相关函数

  • curl_global_init() 初始化libcurl
  • curl_easy_init() 得到 easy interface型指针
  • curl_easy_cleanup() 释放内存
  • curl_easy_setopt() 设置的传输选项,实现回调函数以完成用户特定任务
  • curl_easy_perform() 函数进行访问请求

2.1 curl_global_init()

概要
	#include <curl/curl.h>
	
	CURLcode curl_global_init(long flags);

描述
	此函数设置 libcurl 所需的程序环境。可以将其视为库加载程序的扩展。
	在程序调用libcurl中的任何其他函数之前,必须在程序中至少调用一次此函数(程序是共享内存空间的所有代码)。它设置的环境在程序的生命周期内是恒定的,并且对于每个程序都是相同的,因此多个调用与一个调用具有相同的效果。
	flags 选项是一种位模式,它准确地告诉 libcurl 要初始化哪些功能,如下所述。通过将值 OR 组合在一起来设置所需的位。在正常操作中,必须指定CURL_GLOBAL_ALL。不要使用任何其他值,除非你熟悉它并且意味着控制libcurl的内部操作。
	此函数是线程安全的,因为 libcurl 7.84.0 curl_version_info设置了CURL_VERSION_THREADSAFE功能位(大多数平台)。
	如果这不是线程安全的,则当程序中的任何其他线程(即共享同一内存的线程)正在运行时,不得调用此函数。这不仅仅意味着没有其他线程在使用 libcurl。由于curl_global_init调用其他库的函数,这些函数同样线程不安全,因此它可能与使用这些其他库的任何其他线程冲突。
	如果要从 Windows DLL 初始化 libcurl,则不应从 DllMain 或静态初始值设定项初始化它,因为 Windows 在此期间持有加载程序锁,并且可能会导致死锁。
	有关如何使用此函数的详细信息,请参阅 libcurl 中的全局环境要求说明。

标志
	CURL_GLOBAL_ALL
		初始化一切可能。这将设置除 CURL_GLOBAL_ACK_EINTR 之外的所有已知位。
		
	CURL_GLOBAL_SSL
		(自 7.57.0 以来,此标志的存在或不存在没有任何意义。下面的描述适用于较旧的 libcurl 版本。初始化 SSL。
		这里的含义是,如果未设置此位,则SSL层的初始化需要由应用程序完成,或者至少在libcurl之外完成。如何进行SSL初始化的确切过程取决于libcurl使用的TLS后端。在没有初始化 TLS 层的情况下执行基于 TLS 的传输可能会导致意外行为。
	
	CURL_GLOBAL_WIN32
		初始化 Win32 套接字库。
		这里的含义是,如果未设置此位,则 winsock 的初始化必须由应用程序完成,否则可能会获得未定义的行为。当初始化在 libcurl 之外处理时,此选项存在,因此 libcurl 无需再次执行此操作。
	
	CURL_GLOBAL_NOTHING
		不初始化任何额外的内容。这不会设置位。
	
	CURL_GLOBAL_DEFAULT
		明智的默认值。它将同时初始化SSL和Win32。现在,这等于CURL_GLOBAL_ALL掩码的功能。
	
	CURL_GLOBAL_ACK_EINTR
		自 7.69.0 以来,此位没有意义,但其行为是默认值。
		在 7.69.0 之前:设置此标志时,curl 将在连接或等待数据时确认 EINTR 条件。否则,curl 会一直等到完全超时过去。(7.30.0 中新增)

2.2 curl_easy_init()

概要
	#include <curl/curl.h>
	 
	CURL *curl_easy_init();

描述
	此函数必须是要调用的第一个函数,它返回一个 CURL 简易句柄,您必须将该句柄用作简易界面中其他函数的输入。此调用必须具有相应的调用才能在操作完成时curl_easy_cleanup。
	如果您尚未呼叫curl_global_init,curl_easy_init会自动执行此操作。这在多线程情况下可能是致命的,因为curl_global_init不是线程安全的,并且由于没有相应的清理,它可能会导致资源问题。

	强烈建议您不要允许这种自动行为,请正确调用curl_global_init自己。参见 libcurl(3) 中关于全局环境需求的说明 来了解如何使用这个函数的细节。

2.3 curl_easy_cleanup()

概要
	#include <curl/curl.h>
	 
	void curl_easy_cleanup(CURL *handle);

描述
	此函数必须是调用简单会话的最后一个函数。它与 curl_easy_init 函数相反,必须使用与curl_easy_init调用返回的输入相同的句柄进行调用。
	
	这可能会关闭此句柄使用的所有连接,并且可能一直保持打开状态 - 除非它在执行传输时连接到多句柄。如果您打算传输更多文件,请不要调用此函数,重用句柄是使用 libcurl 获得良好性能的关键。
	
	有时,您可能会收到从curl_easy_cleanup中调用进度回调或标头回调(如果之前使用 curl_easy_setopt 为句柄设置)。就像 libcurl 决定关闭连接并且协议是一种在断开连接之前需要命令/响应序列的协议一样。此类协议的示例是FTP,POP3和IMAP。
	
	在调用并返回此函数后,任何使用句柄都是非法的。curl_easy_cleanup杀死句柄和与之相关的所有内存!
	
	要关闭已与多接口一起使用的简易句柄,请确保先调用curl_multi_remove_handle以在关闭多句柄之前将其从多句柄中删除。
	
	在句柄中传入 NULL 指针将使此函数立即返回,无需执行任何操作。

2.4 curl_easy_setopt () [重点]

概要
	#include <curl/curl.h>
	 
	CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);

描述
	curl_easy_setopt用于告诉libcurl如何表现。通过设置适当的选项,应用程序可以更改 libcurl 的行为。所有选项都设置了一个选项,后跟一个参数。该参数可以是长整型、函数指针、对象指针或curl_off_t,具体取决于特定选项的期望。请仔细阅读本手册,因为错误的输入值可能会导致 libcurl 表现不佳!在每个函数调用中只能设置一个选项。典型的应用程序在设置阶段使用许多curl_easy_setopt调用。

	使用此函数调用设置的选项对使用此句柄执行的所有即将进行的传输有效。这些选项不会在传输之间以任何方式重置,因此如果您希望使用不同的选项进行后续传输,则必须在传输之间更改它们。您可以选择使用 curl_easy_reset将所有选项重置回内部默认值。

	作为 'char *' 参数传递给 libcurl 的字符串由库复制;与指针参数关联的字符串存储可以在curl_easy_setopt返回后被丢弃或重用。此规则的唯一例外是 CURLOPT_POSTFIELDS,但复制字符串CURLOPT_COPYPOSTFIELDS的替代方法具有您需要阅读的一些使用特征。此函数不接受长度超过 CURL_MAX_INPUT_LENGTH (8 MB) 的输入字符串。设置选项的顺序无关紧要。

	在版本 7.17.0 之前,不会复制字符串。相反,用户被迫保持它们可用,直到libcurl不再需要它们。

	句柄是来自curl_easy_init或curl_easy_duphandle调用的返回代码。

具体:https://curl.se/libcurl/c/easy_setopt_options.html

部分函数选项解释
1. CURLOPT_URL
	设置访问URL

2. CURLOPT_WRITEFUNCTION,CURLOPT_WRITEDATA
	回调函数原型为:size_t function(void *ptr, size_t size, size_t nmemb, void *stream);函数将在libcurl接收到数据后被调用,因此函数多做数据保存的功能,如处理下载文件。CURLOPT_WRITEDATA用于表明CURLOPT_WRITEFUNCTION函数中的stream指针的来源。
	
	如果你没有通过CURLOPT_WRITEFUNCTION属性给easy handle设置回调函数,libcurl会提供一个默认的回调函数,它只是简单的将接收到的数据打印到标准输出。你也可以通过CURLOPT_WRITEDATA属性给默认回调函数传递一个已经打开的文件指针,用于将数据输出到文件里。

3. CURLOPT_HEADERFUNCTION,CURLOPT_HEADERDATA
	回调函数原型为 size_t function( void *ptr, size_t size,size_t nmemb, void *stream); libcurl一旦接收到http 头部数据后将调用该函数。CURLOPT_WRITEDATA传递指针给libcurl,该指针表明CURLOPT_HEADERFUNCTION函数的stream指针的来源。

4. CURLOPT_READFUNCTIONCURLOPT_READDATA
	libCurl需要读取数据传递给远程主机时将调用CURLOPT_READFUNCTION指定的函数,函数原型是:size_tfunction(void *ptr, size_t size, size_t
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老痞啥都不会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值