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();// 设置urlcurl_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;}
参考文档
- 官方API文档
相关文章:

curl简介与libcurl开源库的使用总结
curl工具和libcurl不是同一个东西,二者的关系主要体现在以下方面: 定义与性质 curl工具: 是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持多种协议,如HTTP、HTTPS、FTP、FTPS等,可用…...

Win10系统部署RabbitMQ Server
文章目录 版本说明依赖安装添加Erlang环境变量验证Erlang安装 RabbitMQ Server安装解压启动查看RabbitMQ插件安装rabbitmq_management插件再次启动设置RabbitMQ为系统服务 版本说明 ErlangRabbitMQ27.24.0.5 可以在Erlang官网和RabbitMQ官网下载安装包,安装已下载…...
uniapp APP端页面触发调用webview(页面为uniapp开发的H5)里的方法
原理: 使用 getCurrentInstance() 获取当前组件的 Vue 实例,通过 instance.proxy.$scope.$getAppWebview() 获取 Uniapp 的原生 WebView 对象。 使用 WebView 提供的 evalJS 方法,执行嵌入 H5 页面内的 JavaScript 代码 <template>&l…...

嵌入式知识点总结 C/C++ 专题提升(七)-位操作
针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。 目录 1.位操作基础 2.如何求解整型数的二进制表示中1的个数 ? 3.如何求解二进制中0的个数 4.交换两个变量的值,不使用第三个变量。即a3,b5,交换之后a5,b3: 5.给定一个…...

新星杯-ESP32智能硬件开发--ESP32的I/O组成
本博文内容导读📕🎉🔥 ESP32系统的基础外设开发:IO_MUX和GPIO矩阵 IO_MUX和GPIO矩阵 ESP32的I/O组成了与外部世界交互的基础,ESP32芯片有34个物理GPIO引脚。每个引脚都可用作一个通用I/O,或者连接一个内部…...

航空航天混合动力(7)航空航天分布式电推进系统
航空航天分布式电推进系统 1.概述2.分布式电推进系统组成3.关键技术4.分布式电推进系统优势5.国内外研究情况5.1 国外5.2 国内6.分布式电推进系统应用场景6.1 航空领域6.2 航天领域tips:资料来自网上,仅供参考学习使用 1.概述 分布式推进系统是指飞行器推力由位于整个航空器…...

AIGC视频生成明星——Emu Video模型
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍Meta的视频生成模型Emu Video,作为Meta发布的第二款视频生成模型,在视频生成领域发挥关键作用。 🌺优质专栏回顾&am…...

Cyber Security 101-Security Solutions-Firewall Fundamentals(防火墙基础)
了解防火墙并亲身体验 Windows 和 Linux 内置防火墙。 任务1:防火墙的用途是什么 我们看到商场、银行、 餐馆和房屋。这些警卫被安置在 这些区域用于检查进出人员。这 维护此检查的目的是确保没有人在没有 被允许。这个警卫充当了他所在区域和访客之间的一堵墙。 …...

备赛蓝桥杯之第十五届职业院校组省赛第一题:智能停车系统
提示:本篇文章仅仅是作者自己目前在备赛蓝桥杯中,自己学习与刷题的学习笔记,写的不好,欢迎大家批评与建议 由于个别题目代码量与题目量偏大,请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题࿰…...

Docker核心命令与Yocto项目的高效应用
随着软件开发逐渐向分布式和容器化方向演进,Docker 已成为主流的容器化技术之一。它通过标准化的环境配置、资源隔离和高效的部署流程,大幅提高了开发和构建效率。Yocto 项目作为嵌入式 Linux 系统构建工具,与 Docker 的结合进一步增强了开发…...

idea plugin插件开发——入门级教程(IntelliJ IDEA Plugin)
手打不易,如果转摘,请注明出处! 注明原文:idea plugin插件开发——入门级教程(IntelliJ IDEA Plugin)-CSDN博客 目录 前言 官方 官方文档 代码示例 开发前必读 Intellij、Gradle、JDK 版本关系 plu…...

61,【1】BUUCTF WEB BUU XSS COURSE 11
进入靶场 左边是吐槽,右边是登录,先登录试试 admin 123456 admiin# 123456 admin"# 123456 不玩了,先去回顾下xss 回顾完就很尴尬了,我居然用SQL的知识去做xss的题 重来 吐槽这里有一个输入框,容易出现存储型…...

开发环境搭建-1:配置 WSL (类 centos 的 oracle linux 官方镜像)
一些 Linux 基本概念 个人理解,并且为了便于理解,可能会存在一些问题,如果有根本上的错误希望大家及时指出 发行版 WSL 的系统是基于特定发行版的特定版本的 Linux 发行版 有固定组织维护的、开箱就能用的 Linux 发行版由固定的团队、社…...
Spring Boot MyBatis Plus 版本兼容问题(记录)
Spring Boot & MyBatis Plus 版本兼容问题(Invalid value type for attribute factoryBeanObjectType: java.lang.String) 问题描述问题排查1. 检查 MapperScan 的路径2. 项目中没有配置 FactoryBean3. 检查 Spring 和 MyBatis Plus 版本兼容性 解决…...
26. 【.NET 8 实战--孢子记账--从单体到微服务】--需求更新--用户注销、修改用户名、安全设置
在实际开发过程中,项目需求的变更和增加是常见的情况,因此这篇文章我们就模拟一下项目需求新增的情况。 一、需求 项目经理今天提出了新的功能,需要增加重置密码、安全设置、修改用户名、注销账户这四个功能,这四个功能必须是独…...
神经网络|(一)加权平均法,感知机和神经元
【1】引言 从这篇文章开始,将记述对神经网络知识的探索。相关文章都是学习过程中的感悟和理解,如有雷同或者南辕北辙的表述,请大家多多包涵。 【2】加权平均法 在数学课本和数理统计课本中,我们总会遇到求一组数据平均值的做法…...
OpenHarmony OTA升级参考资料记录
OpenHarmony 作为一个开源分布式操作系统,通过其强大的 OTA(Over-The-Air)升级能力,为开发者和厂商提供了一套灵活而安全的系统升级方案。 OTA升级方式 根据升级包的应用方式,OpenHarmony 的 OTA 升级可以分为两种:本地升级和网络OTA升级。 本地升级 本地升级是将已制作…...

在 Kubernetes 上快速安装 KubeSphere v4.1.2
目录标题 安装文档配置repo安装使用插件 安装文档 在 Kubernetes 上快速安装 KubeSphere 配置repo export https_proxy10.10.x.x:7890 helm repo add stable https://charts.helm.sh/stable helm repo update安装 helm upgrade --install -n kubesphere-system --create-name…...

【回忆迷宫——处理方法+DFS】
题目 代码 #include <bits/stdc.h> using namespace std; const int N 250; int g[N][N]; bool vis[N][N]; int dx[4] {0, 0, -1, 1}; int dy[4] {-1, 1, 0, 0}; int nx 999, ny 999, mx, my; int x 101, y 101; //0墙 (1空地 2远方) bool jud(int x, int y) {if…...
华为OD机试真题---战场索敌
华为OD机试真题“战场索敌”是一道考察算法和数据结构应用能力的题目。以下是对该题目的详细解析: 一、题目描述 有一个大小是NM的战场地图,被墙壁’#‘分隔成大小不同的区域。上下左右四个方向相邻的空地’.‘属于同一个区域,只有空地上可…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...