curl简介与libcurl开源库的使用总结

curl工具和libcurl不是同一个东西,二者的关系主要体现在以下方面:

定义与性质

curl工具:

是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持多种协议,如HTTP、HTTPS、FTP、FTPS等,可用于文件上传、下载以及处理cookies、跟踪重定向、执行身份验证等操作。

libcurl库:

是一个广泛使用的、支持多种协议的、开源的客户端URL传输库。它提供了许多用于数据传输的API,例如文件传输、FTP、HTTP、HTTPS、SMTP等,方便开发者在不同的场景下使用。

功能与用途

curl工具:

主要用于在命令行中直接执行各种网络请求和数据传输任务。用户可以通过输入特定的命令和参数,快速地实现与服务器的交互,如发送HTTP请求获取网页内容、上传文件到FTP服务器等。它适用于简单的网络操作和临时性的数据传输需求,常用于测试网络连接、调试API接口等。

libcurl库:

主要应用于程序开发中,为开发者提供了一个强大的网络通信接口。通过调用libcurl提供的函数和API,开发者可以在自己的应用程序中实现复杂的网络功能,如构建自定义的网络客户端、实现自动化的文件下载和上传、进行多线程或异步的网络请求等。它可以与各种编程语言结合使用,如C、C++、Python、PHP等,为不同语言的开发者提供了便利。

使用方式

curl工具:

通过在命令行中输入相应的命令和参数来使用,无需编写代码。例如,使用curl -O http://example.com/file.zip命令可以下载指定URL的文件;使用curl -u username:password -T file.zip ftp://ftp.example.com/命令可以通过FTP上传文件。

libcurl库:

需要在编程环境中使用相应的编程语言调用其API函数。以C语言为例,需要包含libcurl的头文件,然后初始化libcurl库、设置相关选项、执行请求并处理响应结果等。

综上所述,curl工具和libcurl虽然都与网络数据传输相关,但它们在定义、功能和使用方式上存在明显的区别。curl工具是直接在命令行中使用的工具,而libcurl库则是供开发者在程序中调用的库函数集合,两者相辅相成,共同为用户提供了强大的网络功能支持。

curl工具通常就是一个基于libcurl的可执行文件,但是libcurl是源码。

cURL简介

主要参考:

curl工具的入门级使用-CSDN博客

cURL是常用的命令行工具, 它的名字就是客户端(client)的 URL 工具的意思。1997年首次发行。

cURL是一个利用URL语法在命令行方式下工作的开源文件传输工具,也是一个跨平台的库(libcurl), cURL编程用于需要通过Internet协议发送或接收数据的几乎任何地方。它支持几乎所有的互联网协议(DICT,FILE,FTP,FTPS,GOPHER,HTTP,HTTPS,IMAP,IMAPS,LDAP,LDAPS,MQTT,POP3,POP3S,RTMP,RTMPS,RTSP,SCP,SFTP,SMB,SMBS,SMTP ,SMTPS,TELNET和TFTP)。此外,cURL还支持各种选项和参数,如代理支持、文件断点续传、带宽限制、SSL连接等。这些功能使得cURL成为一个灵活和强大的工具,广泛应用于网络开发和系统管理中。

在Windows下安装使用cURL

下载cURL安装包:可以从cURL官网(curl - Download) 下载Windows版本的cURL安装包。根据个人电脑系统位数(32位或64位)选择相应的安装包进行下载。在个人电脑中,curl已经是内置工具了,无需下载安装。在任意位置打开CMD,输入命令curl --help回车,如果出现curl help信息,说明Curl能够运行,比如:

关于在Windows下安装使用cURL,我们就了解这么多,重点关注Linux下的使用。

ubuntu安装和使用curl工具

在Ubuntu上安装curl工具是一个简单的过程。curl是一个非常有用的命令行工具,用于传输数据,支持多种协议,包括HTTP、HTTPS、FTP等。以下是如何在Ubuntu上安装curl的步骤:

复制代码
sudo apt update
sudo apt install curl

系统可能会要求你确认安装。当提示时,输入Y然后按Enter键继续。

安装完成后,你可以通过运行以下命令来验证curl是否成功安装:

复制代码
curl --version

如果curl已成功安装,该命令将显示curl的版本信息。

这就是在Ubuntu上安装curl的全部步骤。现在,你可以开始使用curl来下载文件、测试网站的响应或进行其他网络请求了。

curl命令的简单使用

linux下使用curl来访问百度

在 Linux 下使用 curl 访问百度非常简单。curl 是一个强大的命令行工具,用于与各种协议进行数据传输,包括 HTTP、HTTPS、FTP 等。以下是如何使用 curl 来访问百度的步骤:

在终端中,输入以下命令来使用 curl 访问百度的首页:

复制代码
curl https://www.baidu.com

这个命令告诉 curl 使用 HTTPS 协议去请求百度的服务器,并获取其首页的 HTML 内容。

按下回车键后,curl 会开始执行请求。如果一切正常,你将在终端中看到百度首页的 HTML 源代码。这些代码是由百度服务器返回的,显示了百度首页的内容。

如果你想要将输出保存到文件中,可以使用重定向操作符 >。例如,将百度首页的 HTML 内容保存到名为 baidu.html 的文件中:

复制代码
curl https://www.baidu.com > baidu.html

这样,百度首页的 HTML 内容就会被保存到你当前目录下的 baidu.html 文件中,你可以使用任何文本编辑器打开它进行查看。

如果遇到网络问题或服务器无法访问的情况,curl 会显示错误信息。确保你的网络连接正常,并且目标 URL 是正确的。

其余选项的使用可以使用curl --help或man curl查看帮助信息,每个选项都有详细的说明。

curl命令能为之后curl库的使用提供参考基础,建议在进行curl代码编写前先使用curl命令实现,有些时候的bug不是代码造成的,有可能本身curl就无法建立连接。

libcurl开源库的编译与使用

主要参考:

libcurl开源库的编译与使用全攻略_libcurl编译-CSDN博客

libcurl简介

libcurl 是一个广泛使用的、支持多种协议的、开源的客户端URL传输库,提供了许多用于数据传输的API,例如文件传输、FTP、HTTP、HTTPS、SMTP等。

libcurl 的主要特点包括

支持多种协议:libcurl 支持多种协议,如 HTTP、FTP、SMTP 等,方便开发者在不同的场景下使用。

易于使用:libcurl 的 API 设计简洁,易于使用,方便开发者快速开发出网络通信功能。

可移植性强:libcurl 支持多种操作系统,如 Linux、Windows、MacOS 等,方便开发者在不同的平台上使用。

可定制性强:libcurl 支持插件机制,开发者可以根据自己的需求定制不同的插件,实现不同的功能。

高效稳定:libcurl 在数据传输过程中采用了多种优化技术,保证了数据传输的高效性和稳定性。

总的来说,libcurl 是一个功能强大、易于使用、可移植性强、可定制性强、高效稳定的网络通信库,被广泛应用于各种软件开发中。

本文章主要介绍libcurl在linux平台下的编译步骤,并介绍了libcurl相关的API接口,最后通过一个demo演示如何通过libcurl发送http请求。
libcurl主要使用C语言编写。

从其官方文档来看,在介绍如何使用libcurl时,使用的示例代码均为C语言。并且,libcurl的开发者在开发过程中也是以C语言为基础进行编写和实现的,以确保其在各种操作系统和环境下的高效运行和稳定性。

官方文档

libcurl - API

libcurl相关包下载

libcurl发行版本路径

Releases · curl/curl · GitHub

linux平台下载tar.gz包。以7.85.0版本为例,下载curl-7.85.0.tar.gz 包。

openssl发行版本 :使用libcurl一般都需要依赖openssl库

Releases · openssl/openssl · GitHub

openssl发行版本只有tar.gz包,windows/linux平台都使用这个包即可。以1.1.1u版本为例,下载 openssl-1.1.1u.tar.gz 包

linux平台libcurl库编译

由于需要依赖openssl,先编译openssl库

openssl编译

解压openssl压缩包后进入解压后的目录

分别执行以下命令

复制代码
./config --prefix=${PWD}/_install
sudo make
sudo make install

编译安装完成后,openssl相关库和头文件都会释放到 _install 目录下

libcurl编译

解压libcurl压缩包后进入解压后的目录

分别执行以下命令

复制代码
./configure --prefix=${PWD}/_install --with-openssl=${PWD}/../openssl-1.1.1u/_install
sudo make
sudo make install

--prefix 指定的是安装目录,如果不指定会默认安装到系统目录下。--with-openssl 指定的是openssl相关库目录。

编译安装完成后,相关库和头文件会释放到_install目录下

相关接口

CURLcode curl_global_init(long flags)

描述:初始化libcurl,只能调用一次,且在其他函数之前调用

参数

flags

CURL_GLOBAL_ALL : 初始化所有的可能的调用。

CURL_GLOBAL_SSL : 初始化支持 安全套接字层。

CURL_GLOBAL_WIN32 : 初始化win32套接字库。

CURL_GLOBAL_NOTHING : 没有额外的初始化

返回值 : 返回 CURLE_OK 为成功,返回其他值失败
CURL *curl_easy_init(void)

描述:初始化一个CURL类型的指针,要在 curl_easy_cleanup 中进行释放。

返回值: 返回一个 CURL 类型指针,在 curl_easy_setopt 函数中使用

CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);

描述:设置选项

参数

curl : curl_easy_init 返回的 CURL类型指针

option :curl_easy_setopt函数option参数介绍

返回值 : 返回 CURLE_OK 为成功,返回其他值失败
CURLcode curl_easy_perform(CURL *curl)

描述:以阻塞方式执行请求

参数:

curl :curl_easy_init 返回的 CURL类型指针

返回值:返回 CURLE_OK 为成功,返回其他值失败
CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...)

描述:请求curl 会话中的相关信息

参数

curl :curl_easy_init 返回的 CURL类型指针

info

CURLINFO_RESPONSE_CODE :获取http状态码

其他参数描述

返回值:返回 CURLE_OK 为成功,返回其他值失败
void curl_easy_reset(CURL *curl)

描述:重新初始化CURL指针为默认值
void curl_easy_cleanup(CURL *curl)

描述:清理 curl_easy_init 接口申请的 CURL 类型指针
curl_easy_setopt函数option参数介绍

CURLOPT_URL :设置要访问的URl

CURLOPT_WRITEFUNCTION :设置回调函数,回调函数在libcurl接收到数据后被调用

回调函数原型:size_t function(void *ptr, size_t size, size_t nmemb, void *stream);

CURLOPT_WRITEDATA :用于表明 CURLOPT_WRITEFUNCTION 函数中的stream指针的来源

CURLOPT_HEADERFUNCTION :设置回调函数,回调函数在libcurl接收到http响应头后被调用

回调函数原型 : size_t function( void *ptr, size_t size,size_t nmemb, void *stream);

CURLOPT_HEADERDATA : 表明CURLOPT_HEADERFUNCTION 函数的stream指针的来源。

CURLOPT_TIMEOUT :设置数据传输超时时间

CURLOPT_CONNECTIONTIMEOUT :设置连接超时时间

CURLOPT_POST :设置请求方式为post

CURLOPT_POSTFIELDS : 设置post请求体

CURLOPT_POSTFIELDSIZE :设置post请求大小

CURLOPT_HTTPHEADER : 设置http请求头

CURLOPT_SSL_VERIFYPEER :设置是否验证对端证书,设置为0表示不验证。默认为1,表示验证。

CURLOPT_SSL_VERIFYHOST :设置是都验证服务器证书,设置为0表示不验证。

其他参数

演示代码

复制代码
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <curl/curl.h>
  #include <iostream>
  
  typedef struct {
      std::string body;
  	size_t bodySize;
  } stResponse;
  
  typedef struct {
      std::string header;
  	size_t headerSize;
  } stResponseHeader;
  
  size_t responseBodyCallback(void *ptr, size_t size, size_t nmemb, void *stream) {
      stResponse* pResponse = (stResponse*)stream;
  	pResponse->body.append((char*)ptr, size * nmemb);
  	pResponse->bodySize = size * nmemb;
  	return size * nmemb;
  }
  
  size_t responseHeaderCallback(void *ptr, size_t size, size_t nmemb, void *stream){
  	stResponseHeader* pResponseHeader = (stResponseHeader*)stream;
  	pResponseHeader->header.append((char*)ptr, size * nmemb);
  	pResponseHeader->headerSize = size * nmemb;
  	return size * nmemb;
  }
  
  int main(){
  	std::string readBuffer;
  	stResponse response;
  	stResponseHeader responseHeader;
  
  	// 初始化所有可能的调用
  	curl_global_init(CURL_GLOBAL_ALL);
  
  	
  	CURL *curl = curl_easy_init();
  
  	// 设置url
  	curl_easy_setopt(curl, CURLOPT_URL, "http://182.92.205.179:10088");
  
  	// 设置post请求,不设置或设置为0则为get请求
  	curl_easy_setopt(curl, CURLOPT_POST, 1);
  	// 设置post请求体
  	char postData[1024] = "{\"req\":\"hello\"}";
  	curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);
  	// 设置post请求体大小
  	curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(postData));
  
  	// 设置http请求头
  	curl_slist* headerList = NULL;
  	headerList = curl_slist_append(headerList, "Content-Type: application/json");
  	headerList = curl_slist_append(headerList, "flag: libcurl");
  	curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerList);
  
  	// 设置不校验证书,https请求时使用
  	curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
      curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
  
  	// 设置回调函数获取响应体数据
  	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, responseBodyCallback);
  	curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&response);
  
  	// 设置回调函数获取响应头数据
  	curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, responseHeaderCallback);
  	curl_easy_setopt(curl, CURLOPT_HEADERDATA, (void*)&responseHeader);
  
  	// 超时时间
  	curl_easy_setopt(curl, CURLOPT_TIMEOUT, 5);
  
  	// 执行请求
  	CURLcode res = curl_easy_perform(curl);
  
  	// 检查错误
  	if(res == CURLE_OK){
  		// 获取状态码
  		int responseCode = 0;
  		curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &responseCode);
  		std::cout << "code : "<<responseCode << std::endl;
  
  		std::cout << "responseHeader size : "<<responseHeader.headerSize << std::endl;
  		std::cout << "responseHeader header : "<<responseHeader.header.c_str() << std::endl;
  
  		std::cout << "response size : "<<response.bodySize << std::endl;
  		std::cout << "response body : "<<response.body.c_str() << std::endl;
  	}else{
  		std::cout<<curl_easy_strerror(res)<<std::endl;
  	}
  
  	curl_slist_free_all(headerList);
  
  	// 清理
  	curl_easy_cleanup(curl);
  
  
  	return 0;
  }

参考文档

相关推荐
tan180°36 分钟前
Boost搜索引擎 网络库与前端(4)
linux·网络·c++·搜索引擎
Mr. Cao code1 小时前
Docker:颠覆传统虚拟化的轻量级革命
linux·运维·ubuntu·docker·容器
抓饼先生2 小时前
Linux control group笔记
linux·笔记·bash
挺6的还2 小时前
25.线程概念和控制(二)
linux
您的通讯录好友2 小时前
conda环境导出
linux·windows·conda
代码AC不AC3 小时前
【Linux】vim工具篇
linux·vim·工具详解
码农hbk4 小时前
Linux signal 图文详解(三)信号处理
linux·信号处理
bug攻城狮4 小时前
Skopeo 工具介绍与 CentOS 7 安装指南
linux·运维·centos
宇宙第一小趴菜4 小时前
08 修改自己的Centos的软件源
linux·运维·centos
bug攻城狮4 小时前
彻底禁用 CentOS 7.9 中 vi/vim 的滴滴声
linux·运维·服务器·centos·vim