C语言libcurl库的安装与使用
curl库的作用是访问http和HTTPS网站 HTTPS加密的网站
在linux和树莓派都可以
把curl-7.71.1.tar.bz文件复制到linux的工作目录/home/lth
mkdir http
cd http
在安装curl库之前要安装支持HTTPS的OpenSSL工具
在浏览器搜索wget OpenSSL.tar 获取开源工具方法
wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz安装命令
tar -vxf openssl-1.1.1a.tar.gz
cd openssl-1.1.1a/
./config
make
sudo make install
cp ~/curl-7.71.1.tar.gz . ~ == /home/lth
tar -xvf curl-7.71.1.tar.gz
cd curl-7.71.1
1、vi README 查看库使用说明
cd docs
2、vi INSTALL.md 查看安装库的说明
在调用其他库原理一样
安装
步骤1 有三种选择 ./configure --prefix=
P
W
D
/
i
n
s
t
a
l
l
−
−
w
i
t
h
−
s
s
l
.
/
c
o
n
f
i
g
u
r
e
−
−
p
r
e
f
i
x
=
PWD/_install --with-ssl ./configure --prefix=
PWD/install−−with−ssl./configure−−prefix=PWD/_install --host=arm-linux
P
W
D
当
前
路
径
配
置
指
定
库
安
装
路
径
指
定
编
译
的
工
具
a
r
m
−
l
i
n
u
x
即
在
指
定
那
个
平
台
下
可
使
用
该
库
.
/
c
o
n
f
i
g
u
r
e
−
−
p
r
e
f
i
x
=
PWD当前路径 配置 指定库安装路径 指定编译的工具arm-linux 即在指定那个平台下可使用该库 ./configure --prefix=
PWD当前路径配置指定库安装路径指定编译的工具arm−linux即在指定那个平台下可使用该库./configure−−prefix=PWD/_install
配置 指定安装路径 默认指定平台编译的工具gcc
如果在树莓派就是默认arm-linux-gnueabihf
./configure --prefix=$PWD/_install --host=arm-linux-gnueabihf
–with-ssl添加支持HTTPS格式协议,默认为http,翔云为HTTPS的
./configure --prefix=$PWD/_install --with-ssl
./configure 则为安装默认的路径
步骤2
make 编译之后才生成_install文件
步骤3
make install
cd _install
cd bin查看curl的命令
ls
curl 是一个指令
curl --help查看curl的使用说明
cd … 回到_install目录
cd include 查看curl的头文件
cd lib 查看curl的动态库和静态库
步骤4 调库编译
在编译时需要写入共享库路径
在/curl-7.71.1目录下
写入共享库路径命令:export LD_LIBRARY_PATH=./_install/lib/ 设置程序共享库位置
如果是自己制作的库就要export LD_LIBRARY_PATH=./_install/lib/
如果是别人的库./configure不指定安装路径不用export LD_LIBRARY_PATH=./_install/lib/
gcc demo1.c -I ./_install/include/ -L ./_install/lib/ -lcurl
-大写i curl头文件路径 -L 库路径 -lcurl库 包括curl函数的封装
使用curl库的例程1
#include <stdio.h>
#include <curl/curl.h>
#define true 1
#define false 0
typedef unsigned bool;
bool getUrl(char *filename)
{
CURL *curl;
CURLcode res;
FILE *fp;
if ((fp = fopen(filename, "w")) == NULL) // 返回结果用文件存储
return false;
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_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 true;
}
}
bool postUrl(char *filename)
{
CURL *curl;
CURLcode res;
FILE *fp;
if ((fp = fopen(filename, "w")) == NULL)
return false;
curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "&logintype=uid&u=xieyan&psw=xxx86"); // 指定post内容
//curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");
curl_easy_setopt(curl, CURLOPT_URL, " http://mail.sina.com.cn/cgi-bin/login.cgi "); // 指定url
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
fclose(fp);
return true;
}
int main(void)
{
getUrl("/tmp/get.html");
postUrl("/tmp/post.html");
}
例程2
#include <stdio.h>
#include<string.h>
#include <curl/curl.h>
#define true 1 //C语言中没有bool类型,bool类型是C++的,以下三行是C语言定义的bool类型
#define false 0
typedef unsigned bool;
size_t readfunction( void *ptr, size_t size, size_t nmemb, void *stream){//规定的函数原型
char buf[10240]={'\0'};
strncpy(buf,ptr,10240);
printf("===============================getdata===================================\n");
printf("%s\n",buf);
}
//GET 请求表单
bool getUrl(char *filename)
{
CURL *curl;
CURLcode res;
FILE *fp;
if ((fp = fopen(filename, "w")) == NULL) // 返回结果用文件存储
return false;
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Accept: Agent-007");//
//CURLcode curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init(); // 初始化,相当于套接字
if (curl)
{ //curl_easy_setopt它告诉curl库.程序将有如何的行为. 比如要查看一个网页的html代码等.
//第三个参数 既可以是个函数的指针,也可以是某个对象的指针,也可以是个long型的变量.它用什么这取决于第二个参数的选项宏定义.
//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_WRITEDATA, fp); //将返回的http头内容输出到fp指向的文件
// CURLOPT_WRITEFUNCTION选项将http头内容作为参数调用readfunction函数,与CURLOPT_WRITEDATA是文件
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, readfunction); //是函数
// 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 true;
}
}
bool postUrl(char *filename)
{
CURL *curl;
CURLcode res;
FILE *fp;
if ((fp = fopen(filename, "w")) == NULL)
return false;
curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "&logintype=uid&u=xieyan&psw=xxx86"); // 指定post内容
//curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");
curl_easy_setopt(curl, CURLOPT_URL, " http://mail.sina.com.cn/cgi-bin/login.cgi "); // 指定url
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
fclose(fp);
return true;
}
int main(void)
{
getUrl("/tmp/get.html");
postUrl("/tmp/post.html");
}