libcurl网络协议库

举报
dz小伟 发表于 2022/11/13 13:33:20 2022/11/13
【摘要】 @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、安装库要允许http...

@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 <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.为什么编译运行都要指定位置
因为编译 运行都要把程序链接起来
编译要判断逻辑上有没有错误
运行也要程序链接起来

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。