libcurl库是一个免费且易于使用的客户端 URL 传输库。它支持多种协议,高度跨平台。文档也不错。
本文记录下libcurl的安装与libcurl API的入门使用。
windows和linux上libcurl的安装。
不成功的尝试
我不喜欢在windows上编程,因为安装第三方库比较麻烦。这里先尝试了能否简单的安装。尝试使用windows的包管理器winget安装。
winget安装curl的过程中,可能会失败。看winget的输出,它是先将包下载到Temp路径,然后复制到指定位置。我之前改过环境变量和,将tmp目录放在D盘。这会导致失败。需要将tmp目录改回默认路径。我不知道为什么,也没找到参考链接,但确实有效。。
上面安装过后,可以在中使用curl.exe。但是,我用evertything搜了下,winget没有将curl的头文件和库拷贝到系统路径中去。所以,对于想要在C/C++中使用libcurl的人说,winget无法安装libcurl,它只能安装curl.exe。
vcpkg的安装
参考install curl in window,windows中安装libcurl有和两种方法。我不是很喜欢,而且对于想要在CMake中使用,参考FindCURL对应的FindCURL.cmake,无疑是更好的选择。
所以,这里我们先安装下vcpkg。vcpkg是个跨平台的C/C++库管理器。参见它的Release,可以看到支持很多库。很好!!。但是为啥不把给vcpkg自己做一个安装包。还得从源码编译。执行了脚本,倒也没有源码编译
安装libcurl
按照提示,后面时候cmake的时候,添加上即可。CMAKE_TOOLCHAIN_FILE, 是在 CMake 运行早期读取的文件的路径,该路径指定编译器和工具链实用程序的位置,以及其他目标平台和编译器相关信息。如果在首次build tree时设置了这个环境变量,它将由CMAKE_TOOLCHAIN_FILE环境变量的值进行初始化。所以,为了以后更加方便的时候vcpkg安装的库,而不用记住要使用-D参数添加这个路径,最好的方法是在环境变量中创建一个。
如果想要在特定的编译器中,如vscode,vs中设置CMAKE_TOOLCHAIN_FILE,以及如何在cmake中使用,可参考这几个类似的链接:Using vcpkg with CMake、Linking libcurl with CMake on Windows、find_package: Could NOT find CURL
多好,一行命令搞定。
- curl入门教程: How to Get started with libcURL – 挺好的入门视频,本节的介绍顺序,来自这个视频。
- The libcurl API – 本节的示例代码,来自该链接中的代码。
- HTTP with libcurl – curl支持多种协议,目前仅尝试http协议
在开始使用libcurl api之前,我们需要相对其有个整体上的了解,见:libcurl API overview
libcurl提供了不同组的API。libcurl-easy:当需要进行简单同步的传输,可以使用这组API。libcurl-multi:可以在一个线程内启动多个传输,且不阻塞。libcurl-share:可以在多个curl句柄中共享数据,如cooki,dns缓存,TLS session,但是需要互斥调用。libcurl-url:提供用于解析和生成 URL 的函数。libcurl-ws:接口提供了接收和发送 WebSocket 数据的函数。
libcurl API的简单使用流程是:curl_easy_init创建一个句柄; curl_easy_setopt给创建的句柄设置选项; 然后使用curl_easy_perform进行阻塞式传输。
更多的信息,参见上面的参考链接。知晓一个大概就好,下面进行demo尝试。
参考:Libcurl api overview、Simple HTTPS GET
虽然比较无聊,但还是简单介绍下上面代码中用到的API。
- curl_global_init: 设置 libcurl 需要的程序环境。可能是线程安全的,也可能不是,和libcurl版本有关。建议使用来初始化 SSL 和 Win32 socket。如果此函数返回非零值,则表示出现了错误,无法使用其他 curl 函数。
- curl_global_cleanup: 释放curl_global_init获取的资源。在使用 libcurl 完成后调用。没有返回值。
- curl_easy_init: 它返回一个 CURL 简单句柄, 句柄被其他函数使用。果您还没有调用 curl_global_init,那么 curl_easy_init 会自动调用它。这在多线程情况下可能是致命的,因为 curl_global_ init 不是线程安全的,并且由于没有相应的清理,它可能导致资源问题。尽量自己正确地调用 curl_global_init。如果此函数返回 NULL,则表示出错,无法使用其他 curl 函数。
- curl_easy_cleanup: 关闭curl_easy_init创建句柄。这可能会关闭此句柄使用过的所有连接。句柄调用过这个函数后,这个句柄就不能再使用了。curl_easy_cleanup 会杀死句柄和与之相关的所有内存!没有返回值。
- curl_easy_perform: 阻塞执行传输。在 curl_easy_init 和所有 curl_easy_setopt 调用完成后调用此函数,它将按照选项中的描述执行传输。对于一个句柄,可以多次调用curl_easy_perform。但是句柄是需要互斥访问的资源,所以不要在多线程中使用curl_easy_perform操作相同的句柄。CURLE_OK(0)表示一切正常,非零表示发生错误。
- 关于、、,如果知道TLS握手过程,很容易明白,这里不再赘述。
这里是官方的demo示例:libcurl - small example snippets。
我看了几个。
- http-post: 上一节是GET请求。这个链接中是POST请求的示例。
- http2-upload: 上传文件。(吃完饭困了,待需要的时候再看。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/15806.html