1、简介
1.libcurl是跨平台网络协议库
2.支持应用层http,https,ftp,gopher,tellnet,dict,file,dap协议
3.libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。
4.libcurl官网
5.库下载地址
2、安装
2.1、安装库
要允许https,要在安装libcur之前,安装openssl库
百度搜索 wget OpenSSL,找到库安装
下载库:wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz
解压:tar xvf openssl-1.1.1a.tar.gz
配置,不需要指定路径:./config
编译:make
安装:sudo make install
树莓派安装openssl库
如果树莓派有库,升级库版本,用指令:openssl version
下载解压后,配置更新:./config shared zlib
安装:make && sudo make install
设置软连接使其使用新的OpenSSL版本 刚刚安装的OpenSSL默认安装在/usr/local/ssl
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/ssl/include/openssl /usr/include/openssl
更新动态链接库数据
sudo sh -c “echo ‘/usr/local/lib’ >> /etc/ld.so.conf”
查看版本openssl version发现并没有成功
主要是LD_LIBRARY_PATH这个环境变量没有指定导致openssl正在使用旧的系统OpenSSL库
echo “export LD_LIBRARY_PATH=/usr/local/lib” >> ~/.bashrc
export LD_LIBRARY_PATH=/usr/local/lib
树莓派升级库参考博文:Linux升级openssl
安装openssl报错openssl: /usr/lib/x86_64-linux-gnu/libssl.so.1.1: version `OPENSSL_1_1_1’ not found
- 下载
- 解压
tar xvf curl-7.71.1.tar.bz2
- 配置安装路径,编译器
./configure --prefix=$PWD/_install //安装到_install文件夹,默认编译器gcc x86架构的
./configure --prefix=$PWD/_install --with-ssl//支持ssl
./configure --prefix=$PWD/_install --host=arm-linux CC=//树莓派编译器
- 编译
make
- 安装
make install
2.2、解压完看库文档
1.README
介绍文档
2.docs/curl.1
用户操作手册
3.FAQ
问答文件
4.INSTALL INSTALL.md
怎么编译,安装
找到要安装的环境:Unix
./configure 配置,安装到哪里,没参数表示默认安装
make 编译
make install 把编译结果拷贝到相关文件夹下
./configure --help 和ls --help一样,查看参数
./configure --prefix=xxx 指定安装路径
./configure --host=HOST 交叉编译,指定编译器
3、使用
参考博文:libcurl实现
3.1、API
CURLcode curl_global_init(long flags);
初始化crul库,只能调用一次,不调用自动调用,相当于socket()
参数:CURL_GLOBAL_ALL或CURL_GLOBAL_DEFAULT 初始化所有可能的调用
void curl_global_cleanup(void);
结束crul,和上面函数是一对
CURL *curl_easy_init();
得到指针,之后操作这个指针,类似相当于accept()
返回值:CURL指针
CURLcode curl_easy_setopt(CURL *hand,CURLoption option, parameter);
设置curl,操作,干什么
参数1:CURL指针
参数2:CURLOPT_URL 设置访问curl网站
CURLOPT_WRITEFUNCTION 返回http头输出到哪里
参数3:取决于参数2
curl_easy_perform()
调用,运作完成传输
curl_easy_cleanup(CURL *handle)
释放内存,相当于释放accept()的返回值
3.2、Linux下运行
1.编写程序,访问网页
- 初始化库
- 初始化curl,得到指针curl
- 操作设置curl
- 执行perform
- 释放curl
- 结束库
代码如下
#include <stdio.h>
#include <string.h>
#include <curl/curl.h>
size_t fun( void *ptr, size_t size, size_t nmemb, void *stream)
{
char buf[1024] = {'\0'};
strncpy(buf, ptr, 1024);
printf("%s\n",buf);
}
int getUrl(char *filename)
{
CURL *curl;
CURLcode res;
FILE *fp;
if ((fp = fopen(filename, "w")) == NULL) // 返回结果用文件存储
return 0;
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Accept: Agent-007");
curl = curl_easy_init(); // 初始化
if (curl)
{
//curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");// 代理
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 改协议头
curl_easy_setopt(curl, CURLOPT_URL,"http://www.baidu.com");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fun);
// curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); //将返回的http头输出到fp指向的文件
// curl_easy_setopt(curl, CURLOPT_HEADERDATA, fp); //将返回的html主体数据输出到fp指向的文件
res = curl_easy_perform(curl); // 执行
if (res != 0) {
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}
fclose(fp);
return 1;
}
}
int main(void)
{
curl_global_init(CURL_GLOBAL_DEFAULT);
getUrl("./get");
curl_global_cleanup();
}
/*运行结果
<!DOCTYPE html><!--STATUS OK-->
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<link rel="dns-prefetch" href="//s1.bdstatic.com"/>
<link rel="dns-prefetch" href="//t1.baidu.com"/>
<link rel="dns-prefetch" href="//t2.baidu.com"/>
<link rel="dns-prefetch" href="//t3.baidu.com"/>
<link rel="dns-prefetch" href="//t10.baidu.com"/>
<link rel="dns-prefetch" href="//t11.ba
*/
2.编译
gcc curla.c -I ./curl-7.71.1/_install/include/ -L ./curl-7.71.1/_install/lib/ -lcurl
c文件 指定头文件位置 指定库位置 动态库
3.运行
制作临时环境变量:export LD_LIBRARY_PATH=./curl-7.71.1/_install/lib/
动态库位置
直接运行程序:./a.out
4.为什么编译运行都要指定位置
因为编译 运行都要把程序链接起来
编译要判断逻辑上有没有错误
运行也要程序链接起来
师承上官可编程 —— 陈立臣