Ubuntu 20.04 C语言libcurl的安装以及接口的使用方法


安装libcurl

sudo apt-get install libcurl4-openssl-dev

头文件目录:/usr/include/curl

库文件目录:/usr/lib/x86_64-linux-gnu/libcurl.so.4

根据自己需求安装,包含openssl  是为了支持https

全局初始化

    应用程序在使用libcurl之前,必须先初始化libcurl。libcurl只需初始化一次。可以使用以下语句进行初始化:

curl_global_init();

    curl_global_init()接收一个参数,告诉libcurl如何初始化。参数CURL_GLOBAL_ALL 会使libcurl初始化所有的子模块和一些默认的选项,通常这是一个比较好的默认参数值。还有两个可选值:

CURL_GLOBAL_WIN32

    只能应用于Windows平台。它告诉libcurl初始化winsock库。如果winsock库没有正确地初始化,应用程序就不能使用socket。在应用程序中,只要初始化一次即可。

CURL_GLOBAL_SSL

    如果libcurl在编译时被设定支持SSL,那么该参数用于初始化相应的SSL库。同样,在应用程序中,只要初始化一次即可。

    libcurl有默认的保护机制,如果在调用curl_easy_perform()时它检测到还没有通过curl_global_init()进行初始化,libcurl会根据当前的运行时环境,自动调用全局初始化函数。但必须清楚的是,让系统自已初始化不是一个好的选择。

    当应用程序不再使用libcurl的时候,应该调用curl_global_cleanup来释放相关的资源。

    注意:在程序中,应当避免多次调用curl_global_init和curl_global_cleanup。它们只能被调用一次。

使用easy interface

    首先介绍libcurl中被称为easy interface的api函数,所有这些函数都是有相同的前缀:curl_easy

    当前版本的libcurl也提供了multi interface,关于这些接口的详细使用,在下面的章节中会有介绍。在使用multi interface之前,首先应该理解如何使用easy interface。

    要使用easy interface,首先必须创建一个easy handle,easy handle用于执行每次操作。基本上,每个线程都应该有自己的easy handle用于数据通信(如果需要的话)。千万不要在多线程之间共享同一个easy handle。下面的函数用于获取一个easy handle :

CURL *easy_handle = curl_easy_init();

   在easy handle上可以设置属性和操作(action)。easy handle就像一个逻辑连接,用于接下来要进行的数据传输。

  使用curl_easy_setopt()函数可以设置easy handle的属性和操作,这些属性和操作控制libcurl如何与远程主机进行数据通信。一旦在easy handle中设置了相应的属性和操作,它们将一直作用该easy handle。也就是说,重复使用easy hanle向远程主机发出请求,先前设置的属性仍然生效。

 easy handle的许多属性使用字符串(以/0结尾的字节数组)来设置。通过curl_easy_setopt()函数设置字符串属性时,libcurl内部会自动拷贝这些字符串,所以在设置完相关属性之后,字符串可以直接被释放掉(如果需要的话)。

    easy handle最基本、最常用的属性是URL。应当通过CURLOPT_URL属性提供适当的URL:

curl_easy_setopt(easy_handle, CURLOPT_URL, "https://blog.csdn.net/weixin_48503637?type=blog ");

  假设需要获取URL所表示的远程主机上的资源。那就需要写一段程序用来完成数据传输,也可能希望直接保存接收到的数据而不是简单的在输出窗口中打印它们。所以,我们必须首先写一个回调函数用来保存接收到的数据。回调函数的原型如下:

size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp);

可以使用下面的语句来注册回调函数,回调函数将会在接收到数据的时候被调用:

curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, write_data);

可以给回调函数提供一个自定义参数,libcurl不处理该参数,只是简单的传递:

curl_easy_setopt(easy_handle, CURLOPT_WRITEDATA, &internal_struct);

   如果我们没有通过CURLOPT_WRITEFUNCTION属性给easy handle设置回调函数,libcurl会提供一个默认的回调函数,它只是简单的将接收到的数据打印到标准输出。我们也可以通过CURLOPT_WRITEDATA属性给默认回调函数传递一个已经打开的文件指针,用于将数据输出到文件里。

    下面是一些平台相关的注意点。在一些平台上,libcurl不能直接操作由应用程序打开的文件。所以,如果使用默认的回调函数,同时通过CURLOPT_WRITEDATA属性给easy handle传递一个文件指针,应用程序可能会执行失败。如果我们希望自己的程序能跑在任何系统上,我们必须避免出现这种情况。

    当然,libcurl还支持许多其他的属性。调用下面的函数,将执行真正的数据通信:

success = curl_easy_perform(easy_handle);

 curl_easy_perfrom()将连接到远程主机,执行必要的命令,并接收数据。当接收到数据时,先前设置的回调函数将被调用。libcurl可能一次只接收到1字节的数据,也可能接收到好几K的数据,libcurl会尽可能多、及时的将数据传递给回调函数。回调函数返回接收的数据长度。如果回调函数返回的数据长度与传递给它的长度不一致(即返回长度 != size * nmemb),libcurl将会终止操作,并返回一个错误代码。

    当数据传递结束的时候,curl_easy_perform()将返回一个代码表示操作成功或失败。如果需要获取更多有关通信细节的信息,我们可以设置CURLOPT_ERRORBUFFER属性,让libcurl缓存许多可读的错误信息。

    easy handle在完成一次数据通信之后可以被重用。这里非常建议我们重用一个已经存在的easy handle。如果在完成数据传输之后,我们创建另一个easy handle来执行其他的数据通信,libcurl在内部会尝试着重用上一次创建的连接。

    对于有些协议,下载文件可能包括许多复杂的子过程:日志记录、设置传输模式、选择当前文件夹,最后下载文件数据。使用libcurl,我们不需要关心这一切,我们只需简单地提供一个URL,libcurl会给我们做剩余所有的工作。

以上内容简单介绍了libcurl的安装以及基础接口函数的使用规则,在接下来的文章会更详细说明libcurl的接口函数。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

工匠Sola

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

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

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

打赏作者

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

抵扣说明:

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

余额充值