本教程开发平台: windows 7
libcurl-多协议文件传输库简介:
libcurl是一个免费且易于使用的客户端URL传输库,支持DICT,FILE,FTP,FTPS,Gopher,HTTP,HTTPS,IMAP,IMAPS,LDAP,LDAPS,MQTT,POP3,POP3S,RTMP,RTMPS, RTSP,SCP,SFTP,SMTP,SMTPS,Telnet和TFTP。libcurl支持SSL证书,HTTP POST,HTTP PUT,FTP上传,基于HTTP表单的上传,代理,COOKIE,用户+密码验证(基本,摘要,NTLM,协商,Kerberos),文件传输恢复,http代理隧道等等!
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等
libcurl是免费的,线程安全的,与IPv6兼容的,功能丰富,得到良好支持,快速,文档详尽,并且已被许多知名,大型和成功的公司使用。
libcurl官网地址:https://curl.haxx.se/libcurl/
工具软件准备(列出的是我本地的工具,版本不限):
Visual studio 2019
官网下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/
Qt Creator 4.10.1
官网下载地址:http://download.qt.io/official_releases/qtcreator/
ActivePerl 5
官网下载地址:http://www.activestate.com/activeperl/downloads
NASM 2.11
官网下载地址:http://www.nasm.us/pub/nasm/releasebuilds/2.11.05/win32/nasm-2.11.05-installer.exe
如果本机没有的,请将需要准备的软件下载到本地。
ActivePerl工具下载安装配置:
将ActivePerl-5.20.2MSWin32.zip下载到本地后,进行解压,然后双击ActivePerl-5.20.2MSWin32.msi进行安装,安装完成后,将C:\Perl\bin添加到系统环境变量中(这里请配置自己的安装路径 ),然后到控制台进行测试,成功如下图
NASM工具下载安装配置:
nasm-2.11.05-installer.exe下载到本地后,自己将行安装,然后C:\Program Files (x86)\nasm添加到系统环境变量中(这里请配置自己的安装路径 ),然后到控制台进行测试,成功如下图
nmake配置检测:
Nmake在visual studio安装目录下,在控制台进行检测,如果没有请到进行查询,然后配置到系统环境变量中,测试正常如下图
下载编译openssl:
官网地址:http://www.openssl.org/source/
Github地址:https://github.com/openssl/openssl
Ps:下面提到的d:/cpplib目录是教程本地的,根据需要可以自定义
教程中下载的是openssl-OpenSSL_1_1_1-stable,进行解压,然后复制一份并重命名到d:/cpplib/openssl;
新建目录:d:/cppli/openssl_lib
然后打开vs2019命令行工具:
在开始之前我们先阅读一下软件包下面的INSTALL文档是有说明的,建议多看几遍,
接下来在我们打开的vs控制台,将目录切换到d:/cpplib/openssl,开始执行命令(命令参数不懂请看文档):
$ perl Configure VC-WIN32 --prefix=d:/cpplib/openssl_lib no-asm
$ nmake
$ nmake test
$ nmake install
$ nmake clean
执行成功后,d:/cpplib/openssl_lib中生成如下四个文件夹
下载编译zlib:
官网地址:http://zlib.net/zlib-1.2.8.tar.gz
教程中下载的是zlib-1.2.8,下载后进行解压,然后复制一份并重命名到d:/cpplib/zlib;
切换vs控制台,将目录切换到d:/cpplib/zlib,开始执行命令:
$ nmake -f win32/Makefile.msc
执行完成后如下图会出现编译好的库
下载编译libcurl:
下载地址:https://curl.haxx.se/download/curl-7.70.0.zip
下载后将压缩包进行解压, 然后复制一份并重命名到d:/cpplib/curl;
如果您的程序不需要ssl,如https等,这些步骤便可不执行,该包直接即可使用。
然后我们进入到curl/winbuild目录中,阅读几遍BUILD.WINDOWS.txt文档,其中有一段是告诉我们,如果要开启zlib,openssl等功能,需要准备的工包以及编译前应该按自私样的文件格式存放进行
所以我们需要新建目录d:/cpplib/deps,这里的deps目录与curl目录同级
然后在里面再新建 三个文件夹 lib ,include , bin
接下来将我们前面编译好的openssl动态库从d:/cpplib/openssl_lib/lib中将libssl.lib,libcrypto.lib复制到d:/cpplib/deps/lib中,
将d:/cpplib/openssl_lib/include中的Openssl文件夹复制到d:/cpplib/deps/include目录中,
接下来将编译好的zlib动态库从d:/cpplib/zlib中将zdll.lib , zlib.lib , zlib1.dll 复制到d:/cpplib/deps/lib中,
将d:/cpplib/zlib/目录中的zconf.h , zlib.h , zutil.h复制到d:/cpplib/deps/include目录中
切换到vs控制台面板,然后将目录切换到d:/cpplib/curl/winbuild目录,其中执行的命令请多阅读一下BUILD.WINDOWS.txt,接下来按自己的需求执行编译命令
$ nnake /f Makefile.vc mode=dll VC=14 WITH_SSL=dll WITH_ZLIB=dll DEBUG=yes
接下来开始执行编译,这块呢我们分别编译一个debug版本和release版本的库文件
编译完成后的文件存放在D:\cpplib\curl\builds\目录下,如图我们需要的文件在红色标出的目录中
测试:
在项目根目录下分别新建lib,include,certs目录,然后我们到网上下载一个cert证书放到certs目录下,如图
然后在D:\cpplib\curl\builds目录中将下图中的库文件复制到项目的lib目录下,将release版本下的include下的curl目录复制到项目下的include目录下
然后再将我们前面放到deps下文件夹中对应的文件分别复制到项目根目录的lib和include目录下,所有库文件准备到位后,我们开始编码测试
用Qt Creator打开项目文件后,右键项目名>添加库>外部库,然后如图选择libcurl.lib,下一步
完成后在配置文件.pro中追加生成一段代码,里面的文件名可能需要进行调整,依自己编译器生成进行调整
1 2 3 4 5 6 | win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -llibcurl else :win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -llibcurl_debug else :unix: LIBS += -L$$PWD/lib/ -llibcurl INCLUDEPATH += $$PWD/include DEPENDPATH += $$PWD/include |
我们编写的测试源代码如下 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #include #include #include #include using namespace std; static size_t onWriteData( void *buffer, size_t size, size_t nmemb, void *lpVoid){ string *str &#61; dynamic_cast ((string *)lpVoid); if (str &#61;&#61; nullptr || buffer &#61;&#61; nullptr){ return -1; } char *pData &#61; ( char *)buffer; fstream fs; fs.open( "d:/test/sindsun.html" , ios::app); fs << pData; fs.close(); return nmemb; } int main(){ curl_global_init(CURL_GLOBAL_ALL); CURL *curl &#61; curl_easy_init(); string url &#61; "https://www.sindsun.com" ; curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); //curl_easy_setopt(curl, CURLOPT_POST, 1); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, onWriteData); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false ); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false ); string certPath &#61; "E:/cppStudy/EasyHttp/certs/cert.pem" ; curl_easy_setopt(curl, CURLOPT_CAINFO, certPath.c_str()); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); //curl_easy_setopt(curl, CURLOPT_HEADER, 1); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); CURLcode res &#61; curl_easy_perform(curl); cout << "curlcode is " << res << endl; if (res !&#61; CURLE_OK){ fprintf (stderr, "curl_easy_perform() failed: %s\n" , curl_easy_strerror(res)); } curl_easy_cleanup(curl); return 0; } |
对于libcurl在代码中的使用&#xff0c;请到官网或者其它网站上进行查阅。
执行后的结果如图&#xff1a;
我们获取到的html文件如图
到这里就大功告成了。
如果您一直未编写成功&#xff0c;我将我编译好的文件分享给您
百度网盘&#xff1a;https://pan.baidu.com/s/18kJhZnpUWFIdtZsRlHIwyw 提取码&#xff1a;vds7
写在最后的感受&#xff1a;
C&#43;&#43;相对其它语言确实是有很多复杂之处&#xff0c;就像这次为了使用libcurl库进行Https请求&#xff0c;一直折腾了四五天&#xff0c;对工具的了解&#xff0c;相关库的下载编译&#xff0c;还有库的调用等等&#xff0c;对于刚刚入门的我真的是一头雾水&#xff0c;没日没夜的查资料研究&#xff0c;最后终于实现了https的请求&#xff0c;过程中收获了不少的知识 &#xff0c;其实挺有意义的。另外一点&#xff0c;虽说这些刚开始复杂了一些&#xff0c;但只要用心研究&#xff0c;多查资料&#xff0c;或者有认识的人的话多请教&#xff0c;解决技术上的一些问题是非常容易的。由于网上的很多教程确实比较零散&#xff0c;我在学习完成 后把这些整理了再来 &#xff0c;希望可以帮助到有需要的朋友&#xff0c;其它方面的应用请自由发挥&#xff0c;分享真的是一件很快乐的事。