@TOC
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 //树莓派编译器
编译
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
#include
#include
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();
}
/*运行结果