C语言libcurl库的使用

2023-10-31

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/installwithssl./configureprefix=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= PWDarmlinux使./configureprefix=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");
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言libcurl库的使用 的相关文章

  • 代码::块 - 警告:GDB:无法设置控制终端:不允许操作

    我已经通过官方存储库在 Ubuntu 14 04 中安装了 Code Blocks 13 12 当我编译时 一切正常 但是当我调试时 shell 中会显示以下消息 警告 GDB 无法设置控制终端 操作不正确 允许的 程序执行到断点 但当我执
  • 如何从脚本向 sudo 提供密码?

    请注意 这是在我的本地计算机上运行的来宾虚拟机 VBox 我不担心安全性 我正在编写一个将在 Linux Ubuntu VM 上执行的脚本myuser用户 该脚本将在下面创建一个非常大的目录树 etc myapp 目前我必须手动完成所有这些
  • sed 仅最后一个匹配模式

    我想sed仅文本文件的最后一个匹配模式 输入文件 boy boy girl boy 输出文件 boy boy girl boys 一种方法是反转文件 仅替换第一个匹配项 然后再次反转 tac
  • 如何将推送的分支复制到另一个目录?

    我有一个分支叫master 生产 另一个称为development 当我从 master 推送提交时 post receive 挂钩执行 git work tree var www mywebsite com git dir var rep
  • pygraphviz,导入错误:未定义的符号:Agundirected

    import pygraphviz Traceback most recent call last File
  • bash双括号问题

    我对 bash 脚本非常陌生 在使用双括号时遇到了问题 我似乎无法让它们在 Ubuntu Server 11 10 中工作 我的下面的脚本位于 if test sh 中 bin bash if 14 14 then echo FOO fi
  • 在64位操作系统上以32位模式和64位模式编译ioctl函数的执行有什么不同?

    我有 64 位 Enterprise SuSE 11 我有一个应用程序 它打开 HIDRAW 设备并在其上操作 ioctl 函数以从该设备获取原始信息 如下所示 struct hidraw devinfo devinfo int fd op
  • Alsa 带有来自调制解调器的 PCM 接口

    我有一个基于 imx28 CPU 的定制板 CPU 的串行端口连接到调制解调器的 PCM 输出 我必须为调制解调器的 PCM 接口开发一个驱动程序 使其成为 ALSA SoC 的一部分 您能指出内核树 中与我的设置重新组合的一些驱动程序吗
  • 如何使用 SVN 通过网络提交单个文件?

    我可以查看整个svn使用以下命令存储库 svn co https myaccount svn beanstalkapp com myapp 但我无法弄清楚提交单个文件的命令 如果我改变成myapp page1 html 我怎样才能只签入那一
  • xdotool 类型需要很长时间并导致整个桌面冻结

    我一直在使用xdotool type过去只能在快捷方式上输入耸肩xdotool type 这可行 但总是需要相当长的时间 并导致整个桌面冻结 完全冻结 而不仅仅是输入 几秒钟 不过并没有太打扰我 现在我需要一种方法来从文件中读取内容 对其进
  • 测试linux下磁盘空间不足

    我有一个程序 当写入某个文件的磁盘空间不足时 该程序可能会死掉 我不确定是否是这种情况 我想运行它并查看 但我的测试服务器不会很快耗尽空间 有什么办法可以嘲笑这种行为吗 看起来没有任何方法可以在 Ubuntu 中设置文件夹 文件大小限制 并
  • 原生 Linux 应用程序可像 ResHacker 一样编辑 Win32 PE

    我想运行自动修改 dll服务 用户提交特定的 dll 我在服务器上修改它 然后用户可以下载 dll的修改版本 是否有任何本机 Linux 应用程序提供常见的 Win32 PE 修改功能 例如图标 字符串 加速器 对话等 至少提供命令行或脚本
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • /proc/PID 文件格式

    我想从中检索一些流程信息 proc目录 我的问题如下 中的文件是否有标准格式 proc PID 例如 有这个proc PID status文件与Name t ProcName在第一行 我可以在其他地方用空格代替这个文件吗 t或者类似的东西
  • Docker DNS 设置

    我尝试使用自定义网络和 dos 设置创建 docker 容器 docker网络创建 driver bridge opt com docker network bridge enable ip masquerade true opt com
  • 是否有可能通过 mmap 匿名内存“打孔”?

    考虑一个使用大量大致页面大小的内存区域 例如 64 kB 左右 的程序 每个内存区域的寿命都相当短暂 在我的特定情况下 这些是绿色线程的替代堆栈 如何最好地分配这些区域 以便一旦该区域不再使用 它 们的页面可以返回到内核 天真的解决方案显然
  • 如何阅读shell命令的源代码?

    我想阅读编写linux命令的实际源代码 我已经获得了一些使用它们的经验 现在我认为是时候与我的机器进行更深层次的交互了 我在这里找到了一些命令http directory fsf org wiki GNU http directory fs
  • 如何从“git log”中查看 Git 中的特定版本?

    My git log显示为 enter code here git trial git log commit 4c5bc66ae50780cf8dcaf032da98422aea6e2cf7 Author king lt email pro
  • 如何在 Linux 中使用单行命令获取 Java 版本

    我想通过单个命令获取 Linux 中的 Java 版本 我是 awk 的新手 所以我正在尝试类似的事情 java version awk print 3 但这不会返回版本 我将如何获取1 6 0 21从下面的Java版本输出 java ve
  • Linux 文本文件操作

    我有一个格式的文件 a href a href a href a href 我需要选择 之后但 之前的文本 并将其打印在行尾 添加后 例如 a href http www wowhead com search Su a a a a a

随机推荐

  • HTML实现简单的注册页面

    HTML是一种标记语言 用于创建网页 这里使用HTML创建了一个简单的注册页面 其中包含表单元素 如文本框 密码框 单选按钮 下拉列表 文件上传和文本域 先看看效果图 代码如下
  • 可视化图片时显示中文标签

    coding UTF 8 import cv2 import glob import os from PIL import Image ImageFont ImageDraw import numpy as np color 0 255 0
  • 无线连接让智能手表用户可以自行沟通和监控

    诸如智能手表和智能眼镜之类的产品正在激增 它们中的大多数由于多个传感器 低功耗嵌入式处理器 直视或虚拟显示器以及无线通信链路 Wi Fi或蓝牙 来连接到智能手机 从而提供各种功能 主机系统 或互联网 尽管这些高度集成的系统中有许多提供了所需
  • Flutter: Dart 参数,以及 @required 与 required

    1 Dart 参数 Dart 函数的参数分 3 种类型 位置参数 命名参数 可选位置参数 1 1 位置参数 positional parameters 参数位置重要 名称任意 定义 void debugger String message
  • uniapp开发的App(安卓)端跳转uniapp微信小程序

    本文总结两种跳转方法 适合自己的才是最好的 1 根据微信开放文档提供的方法获取小程序的URL 两种 小程序的URL Scheme weixin dl business t TICKET 小程序的URL Link https wxaurl c
  • 宝塔控制面板无法访问,浏览器提示连接失败

    防火墙已经关闭 端口已经开好 但宝塔控制面板无法访问 浏览器提示连接失败 错误信息 火狐浏览器提示连接失败 解决思路 连接ssl重启宝塔 宝塔重启命令 bt restart
  • 全国地区树形结构列表。TreeNode工具

    Select select from shop region order by id ResultType java util LinkedList class 虽然这里用了LinkedList 但好像后面并没有用到 List
  • 三色标记算法

    什么是三色标记 CMS的运行过程中存在并发标记过程 由于不产生STW 所以对垃圾的清理必须存在标记和删除两个过程分开 而不能看到是垃圾就直接清除 否则会引起不必要的麻烦 CMS为了解决这个问题 采用了三色标记算法来记录对象是否已经被扫描过
  • 环境篇-在Qt工程中调用OpenSSL

    本文属于 OpenSSL加密算法库使用系列教程 之一 欢迎查看其它文章 我们知道OpenSSL有一个命令行工具openssl exe 可以通过命令实现很多的操作 同时OpenSSL还提供了动态库 所以如果我们想调用OpenSSL 有2种方法
  • 树的应用举例

    二叉树 先序遍历 这里指根在先 from collections import deque class BitTree def init self self root None def insert self node pos pass s
  • meilisearch使用记录

    分页 查找内容 默认一页十条 def search q from size 10 return client index indexName search q opt params limit size offset from 当前页 st
  • 剖析RedHat Linux中三个重要内核文件

    在网络中 不少服务器采用的是Linux系统 为了进一步提高服务器的性能 可能需要根据特定的硬件及需求重新编译Linux内核 编译Linux内核 需要根据规定的步骤进行 编译内核过程中涉及到几个重要的文件 比如对于RedHat Linux 在
  • (简单成功)原生js实现点击复制文本

    目录 背景 核心代码 案例 背景 我们开发中可能会有点击复制的功能 那么下面将讲述 核心代码 select 方法用于选择该元素中的文本 document execCommand copy 执行浏览器复制命令 案例
  • 微信网页调用jssdk扫一扫,63002报错的坑,ios的兼容问题

    一 因为项目需要用到微信网页扫一扫功能 并且去找了很多文章都没有统一的整理 所以就整理了一下 比较常见的坑 1 如何在网页调用扫一扫功能 1 先引入npm npm install weixin js sdk 如果你需要用微信的支付那些api
  • PWN学习-ADworld刷题

    前言 搁置了一段时间没更博 经历了考试还有一些其他事 决心好好去学pwn 学习的方法打算是按照看视频课加刷题加查找资料来学习 先把新手题都刷了一遍 都是很入门的题目 没啥好提的 收获也少 然后去刷进阶的题 但是目前还没有遇到堆的题目 视频课
  • C语言队列的理解

    队列是一种特殊的线性表 特殊之处在与允许在表的前端 front 进行删除操作 而在表ide后端进行插入操作 和栈一样 队列时一种操作受限制的线性表 进行 插入操作的端称为队尾 进行删除操作的端称为队头 队列的数据元素称为队列元素 在队列中插
  • Spring cloud系列-Nacos:Nacos的使用和报错处理

    目前你让我刚接触SpringCloud就来说Nacos做注册中心的优劣 或者深入的讲解Nacos 可能是有点为难我 Nacos是阿里开源的一个项目 一个负责发现 配置 管理微服务的一个平台 也就是说微服务这一块他还是不错的 下面是Nacos
  • uniapp - App 超详细消息推送功能实现,从 0-1 实现官方 unipush 推送全步骤稳定性毋庸置疑(附带详细的可运行示例源码和注释,保证 100% 完美接入)苹果安卓手机

    效果图 网上的教程太乱用不了 无法改造成自己想要的效果 在uniapp中开发的app 安卓苹果 使用 unipush 官方推送 从0 1实现完整过程及功能开发 你可以直接复制示例源码 跟着教程一步步配置 注释详细 准备 消息
  • JS手动实现一个new操作符

    要手动实现一个 new 操作符 首先要知道 new 操作符都做了什么事 即构造函数的内部原理 1 创建一个新对象 2 链接到原型 将构造函数的 prototype 赋值给新对象的 proto 3 绑定this 构造函数中的this指向新对象
  • C语言libcurl库的使用

    C语言libcurl库的安装与使用 curl库的作用是访问http和HTTPS网站 HTTPS加密的网站 在linux和树莓派都可以 把curl 7 71 1 tar bz文件复制到linux的工作目录 home lth mkdir htt