当前位置: 首页 > news >正文

设计网站广告标语/网站建设报价方案

设计网站广告标语,网站建设报价方案,厦门注册公司流程和费用多少,网站架设标准一、AFL简介 AFL(American Fuzzy Lop)号称是当前最高级的Fuzzing 测试工具之一 ,是由安全研究员Michał Zalewski(lcamtuf)开发的一款 基于覆盖引导(Coverage-guided)的 模糊测试工具&#xff0…

一、AFL简介

AFL(American Fuzzy Lop)号称是当前最高级的Fuzzing 测试工具之一 是由安全研究员Michał Zalewski(@lcamtuf)开发的一款 基于覆盖引导(Coverage-guided)的 模糊测试工具,它 通过记录输入样本的代码覆盖率,从而调整输入样本以提高覆盖率,增加发现漏洞的概率
AFL 采用新型的 编译时插桩遗传算法自动发现新的测试用例,这些用例会触发目标 二进制文件中的新内部状态。这大大改善了模糊测试的代码覆盖范围。
AFL既可以对源码进行编译时插桩,也可以使用AFL的QEMU mode对二进制文件进行插桩,但是前者的效率相对来说要高很多。
AFL的 优点是可以轻松部署,配置相对简单,测试效率相对较高。 原生的AFL仅适配于C/C++程序的测试,不过目前已经衍生出很多分支,用于适配其他语言的模糊测试,如针对JAVA程序的Kelinci等
工作流程大致如下:
    ①从源码编译程序时进行插桩,以记录代码覆盖率(Code Coverage);
    ②选择一些输入文件,作为初始测试集加入输入队列(queue);
    ③将队列中的文件按一定的策略进行“突变”;
    ④如果经过变异文件更新了覆盖范围,则将其保留添加到队列中;
    ⑤上述过程会一直循环进行,期间触发了crash的文件会被记录下来。
AFL变异的方式
AFL是采用遗传算法,基于变异生成的测试用例,变异的主要类型有下面这几种:
  • bitflip:按位翻转,1变为0,0变为1
  • arithmetic:整数加/减算术运算
  • interest:把一些特殊内容替换到原文件中。所谓的特殊内容是AFL预设的一些比较特殊的数,比如可能造成溢出的数。
  • dictionary:把自动生成或用户提供的token替换/插入到原文件中
  • havoc:“大破坏”,是前面几种变异的组合
  • splice:“连接”,此阶段会将两个文件拼接起来得到一个新的文件

二、AFL安装和使用

利用AFL进行模糊测试的大概 过程:①插桩编译;②设置种子测试用例;③开始fuzz 。模糊测试对于软件测试的帮助很大,其不受限于被测系统的内部实现细节和复杂程度。

2.1、安装

AFL 自带定制版本的 gcc 和 clang 编译器,建议选择 LLVM 的 clang 编译器,可以加快 fuzz 的速度。
下载AFL源码( GitHub - google/AFL: american fuzzy lop - a security-oriented fuzzer),解压后,编译安装:
AFL使用afl-gcc编译
make
sudo make install  安装到系统目录
AFL使用afl-clang编译
cd llvm_mode
make
cd ..
sudo make install 
查看路径可以看到afl安装的文件:
作用分别为
  • afl-gcc 和afl-g++ 分别对应的是gcc 和g++ 的封装
  • afl-clang 和afl-clang++ 分别对应clang 的c 和c++ 编译器封装À。
  • afl-fuzz 是AFL 的主体,用于对目标程序进行fuzz。
  • afl-analyze 可以对用例进行分析,通过分析给定的用例,看能否发现用例中有意义的字段。
  • afl-qemu-trace 用于qemu-mode ,默认不安装 ,需要手工执行qemu-mode 的编译脚本进行编译,后面会介绍。
  • afl-plot 生成测试任务的状态图
  • afl-tmin 和afl-cmin 对用例进行简化
  • afl-whatsup 用于查看fuzz 任务的状态
  • afl-gotcpu 用于查看当前CPU 状态
  • afl-showmap 用于对单个用例进行执行路径跟踪
afl-fuzz指令:
下面我们进行一个简单的AFL实验了解其使用流程。

2.2、准备被测程序

首先创建一个简单的test.c源文件,里面放入我们要测的c程序。
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <signal.h> int AFLTest(char *str)
{int len = strlen(str);if(str[0] == 'A' && len == 6){raise(SIGSEGV);//如果输入的字符串的首字符为A并且长度为6,则异常退出}else if(str[0] == 'F' && len == 16){raise(SIGSEGV);//如果输入的字符串的首字符为F并且长度为16,则异常退出}else if(str[0] == 'L' && len == 66){raise(SIGSEGV);//如果输入的字符串的首字符为F并且长度为66,则异常退出}else{printf("it is good!\n");}return 0;
}int main(int argc, char *argv[])
{char buf[100]={0};gets(buf);//存在栈溢出漏洞printf(buf);//存在格式化字符串漏洞AFLTest(buf);return 0;
}

2.3、使用 afl-gcc 插桩编译

编译插桩是指在代码编译期间修改或新增代码

用 AFL 编译目标源码,其目的在于插桩,让编译得到的程序,反馈路径覆盖。AFL 自带定制版本的 gcc 和 clang 编译器,建议选择 LLVM 的 clang 编译器,可以加快 fuzz 的速度。
编译过程和普通gcc编译也是一样,除了使用的命令需要带上afl-前缀,因此
afl-gcc -g -o test  test.c   # 针对c文件, -g选项为使用gdb调试所需,如果不调试就不需加此选项。 在linux下编译链接程序,如果不加-o参数,生成的binary代码的名字都是默认的a.out
可以看到在编译过程中,编译器已经提示存在漏洞,不理会,用AFL去测试
编译后会有插桩符号,使用下面的命令可以验证这一点: readelf -s ./test | grep afl
注:
针对c++文件,则使用 afl-g++ -g -o test  test.cpp
注意在编译项目时,通常有Makefile,这是就需要在Makefile中添加内容: gcc/g++重新编译程序的方法是:
CC=/path/to/afl/afl-gcc ./configure
make clean all
对于一个C++程序,要设置:
CXX=/path/to/afl/afl-g++.
afl-clang和afl-clang++的使用方法类似。

2.4、准备种子语料库

2.4.1、搜集种子语料库

作为模糊测试,AFL需要提供初始的种子输入, 变异算法会根据此种子变异生成各种测试用例,喂给程序。但实际上,你完全可以提供任何无意义的输入作为种子,模糊测试也一般能达到效果,只不过效率会低一些而已,是否提供有意义种子?提供多少?无外乎在种子获取难度和测试的效率要求之间进行权衡而已。
这里,借用 Freebuf 提供的资料,给出一些开源的语料库
  • libav sample s
  • ffmpeg samples
  • fuzzdata
  • moonshine
  • afl generated image test sets
  • fuzzer-test-suite
事实上很多程序也会自带一些案例,也可以作为测试用例。
在这里我们生成一好一坏两个种子语料库:
mkdir good-seeds bad-seeds
echo '1+1' > good-seeds/any-seed
echo 'this is a bad seed' > bad-seeds/any-seed

2.4.2、精简语料库

找到语料库之后,最好能够进行修剪, 合并重复用例,裁剪体积afl 推荐的每个用例体积小于 1KB,不然会影响 fuzz 的效率。

2.4.2.1、去重

afl-cmin 可以精简语料库,去掉可能重复的测试用例,可大大减少无用的 fuzz 用例
afl-cmin -i input_dir -o output_dir -- /path/to/tested/program [params]
更多的时候,我们是从文件中获取输入,因此,往往使用 @@ 替代 params(参数),即
afl-cmin -i input_dir -o output_dir -- /path/to/tested/program @@

2.4.2.2、裁剪体积

afl-tmin  可以缩短文件体积,因为 afl 要求测试用例的大小最好小于 1KB ,因此最好将精简后的用例进一步缩小体积。afl-tmin 有两种工作模式, instrumented mode crash mode 。默认的工作方式是instrumented mode
afl-tmin -i input_file -o output_file -- /path/to/tested/program [params] @@
由于 afl-cmin 一次性只能精简单个文件,如果用例特别多,需要手动花费很长时间,其实一条简单的 shell 脚本即可完成
for i in *; do afl-tmin -i $i -o tmin-$i -- ~/path/to/tested/program [params] @@; done;

2.5、开始测试

在执行afl-fuzz前,如果系统配置为将核心转储文件(core)通知发送到外部程序,将导致将崩溃信息发送到Fuzzer之间的延迟增大,进而可能将崩溃被误报为超时,所以我们得临时修改core_pattern文件:  echo core >/proc/sys/kernel/core_pattern
对于可以直接从stdin读取输入的目标程序来说,执行命令, afl-fuzz  -i good-seeds/ -o good-outputs -- ./test
对从文件读取输入的目标程序来说,要用“@@”: afl-fuzz -i ./in/ -o ./out/ -Q ./readelf -a @@    # 开始fuzz, @@表示从in 文件夹中找elf作为输入 ,实际上是在执行readelf -a 文件名
ctrl-C结束fuzz,共找到了6个crash,可以看到当前目录下已经多出了good-outputs目录,这是本次模糊测试的结果。
process timing:展示的是fuzzer的运行时间,也可以看到最近一次发现新路径的时间,最近一次崩溃的时间和最近一次挂起的时间。
overall result:运行的总周期数,总路径数,崩溃次数和挂起次数
cycle progress:fuzzer正在处理的测试样例的编号和由于超时放弃的的输入数量,从而得知fuzzer处理了多少样例,队列中还剩多少
map coverage
第一行显示的是已经命中了多少分支元组与位图可以容纳的数量的比例。左边的是当前输入,右边的是整个输入语料库的值。
第二行显示的是二进制文件中元组命中计数的变化,如果对于所有尝试的输入,每个采用的分支都采用固定的次数。读数显示为1.00, 当设法触发每个分支的其他命中计数时,读数向8.00移动(8位映射命中每一位),但可能永远不会到达极限。
这些值可以用于比较不同的模糊测试对于同一检测二进制文件的覆盖范围。
stage progress:显示了正在测试的策略(AFL变异方式),进度,总执行次数和执行速度。一般正常的执行速度应该在500以上。
findings in depth
这一部分的数据对一般的使用者用处不大,包括基于应用到代码的最小化算法获得的fuzzer最喜欢的路径数和真正获取更好的边缘覆盖率的测试用例数,还有超时和崩溃的计数器,注意这里的timeout和hang有所不同,timeout计数器包括了所有超过超时的测试用例,即使它们没有超过超时足够的幅度而分类为hangs(挂起)
fuzzing strategy yields:用于追踪各种fuzzing策略所获得的路径和尝试执行的次数的比例,用于验证各种方法的有效性。
path geometry
第一个数据指的是fuzzing过程中达到的路径深度,通常用户提供的测试用例视为1级,传统模糊测试从中获得的测试用例视为2级,通过它们作为后续模糊测试回合的输入得到的结果为3级,以此类推。
下一个数据pending指的是还有多少输入数据没有经过任何测试。pend fav时指fuzzer在这个队列中真正想到达的条目。接下来的是这个fuzzing部分找到的新路径数量和在进行并行化fuzzing时从其他fuzzer实例导入的路径数量 。
最后一个数据可以衡量观测到痕迹的一致性,如果程序对相同的输入始终表现相同,则为100%,若数值较低但仍然显示为紫色,测试过程不太可能受到负面影响,而显示红色说明出现了问题,afl可能难以区分调整输入文件的有意义的效果和幻象效果

2.6、fuzz结果分析

crashes:导致目标接收致命signal而崩溃的独特测试用例
queue:存放所有具有独特执行路径的测试用例。
AFL输出文件:
  • crashes/README.txt:保存了目标执行这些crashes文件的命令行参数。
  • hangs:导致目标超时的独特测试用例。
  • fuzzer_stats:afl-fuzz的运行状态。
  • plot_data:用于afl-plot绘图。
查看第1个crash,发现符合栈溢出漏洞的crash情况(最长输入100字符):
查看第2个crash:发现符合首字符为A且字符串长度为6的异常退出情况:
查看第3个crash:发现符合首字符为F且字符串长度为16的异常退出情况:
查看第4个crash,发现符合栈溢出漏洞的crash情况(最长输入100字符):
查看第5个crash,发现符合栈溢出漏洞的crash情况(最长输入100字符):
查看第6个crash:发现符合输入的字符串的首字符为L并且长度为66的异常退出情况:
AFL编译后的是一个普通的可执行文件,可以直接在命令行使用 ./test启动运行,然后此时你需要在终端进行输入,然后又会在终端获得输出:
afl-plot 可以绘制更加直观的结果,利用的就是 fuzzer 生成的 plot_data 文件。当然,要使用 afl-plot ,需要先安装 apt-get install gnuplot

三、并行fuzz测试

在使用afl-fuzz时,每个进程只会占用一个CPU核心。如果我们的机器是多核处理器,我们可以通过进行分布式fuzz来提高fuzz速度。
首先先看自己有多少内核: afl-gotcpu
以上可以看出可以运行6~8个实例。
首先指定主实例 -M 用于主实例,将 -S 添加到所有从属实例。注意, 这里-o跟的参数一定要保持一致,这个是用来同步各个fuzz进程的
  • 主实例:   afl-fuzz  -M master  -i  good-seeds/   -o good-outputs   -m none  --   ./test
  • 从实例1 afl-fuzz  -S slave1   -i  good-seeds/   -o good-outputs   -m none  --   ./test
  • 从实例2: afl-fuzz  -S slave2   -i  good-seeds/   -o good-outputs   -m none  --   ./test
若分布式意外退出可以使用以下命令继续fuzz任务:
  • 主实例:   afl-fuzz  -M master   -i-   -o good-outputs  -m none  --   ./test
  • 从实例1 afl-fuzz  -S slave1    -i-   -o good-outputs   -m none  --   ./test
  • 从实例2: afl-fuzz  -S slave2   -i-   -o good-outputs  -m none  --   ./test
运行后会在good_outputs文件夹会多出三个不同的文件夹master、slave1、slave2:

四、黑盒 fuzz(无源码AFL测试)

以上 fuzz 过程,依赖于我们有程序的源码,并且在编译过程中进行了插桩,但很多时候,我们并 没有源码,这时候就要靠 afl 提供的 qemu_mode 模式了( 只要在之前的命令的基础上加上-Q的参数即可  。原版本的 afl qemu 模式由于版本过老,已不能正常运行,推荐使用 github 上的   AFLplusplus  或者  afl-unicorn。AFLplusplus 更容易安装,而 afl-unicorn 针对 qemu 模式更加友好。

4.1、qemu_mode模式安装

无论是下载的哪个版本的 afl,根目录下都会有 qemu_mode 文件夹,进入此目录,运行以下脚本,如果没有出错,就代表 qemu_mode 成功了:
cd qemu_mode
sudo ./build_qemu_support.sh
cd ..
make install
安装注意事项:
  • 修改build_qemu_support.sh文件中的 QEMU_URL=" https://download.qemu.org/qemu- ${VERSION}.tar.xz",不然提示404
  • 参考 我的AFL入门之路 - 知乎 (zhihu.com) 更改一些配置:

4.2、示例

>>> 继续使用上面简单c代码进行测试,但 这次采用gcc进行编译,而不是afl-gcc。将test.c编译为test2
执行命令: afl-fuzz -Q -i good-seeds/ -o good-outputs  --  ./test2
可以看出:同样的程序,在qemu 模式下比在源码编译插桩的模式下会慢很多。(通过观察stage progress下的exec speed)
>>> 一个Fuzz实例
测试readelf。 由于readelf的输入其实就是elf文件,因此需要在in目录下放一个输入elf。 按照流程创建文件夹和测试用的elf。 
cd AFL/testcases/mytest
mkdir in out
cd in
cp ../../others/elf/small_exec.elf  .    # afl目录中自带一些常用文件的testcase
cd ..
cp /usr/bin/readelf .    # 将readelf复制到mytest 目录下
afl-fuzz -i ./in/ -o ./out/ -Q ./readelf -a @@    开始fuzz,@@表示从in文件夹中找elf作为输入,实际上是在执行readelf -a 文件名

五、参考

google/AFL: american fuzzy lop - a security-oriented fuzzer (github.com)

入门AFL | I'm dev (i-m.dev)

我的AFL入门之路 - 知乎 (zhihu.com)

AFL实战_Elwood Ying的博客-CSDN博客

经典 Fuzzer 工具 AFL 模糊测试指南_swift fuzzer工具_江下枫的博客-CSDN博客

模糊测试技术线上分享_哔哩哔哩_bilibili

相关文章:

AFL模糊测试

一、AFL简介 AFL&#xff08;American Fuzzy Lop&#xff09;号称是当前最高级的Fuzzing 测试工具之一 &#xff0c;是由安全研究员Michał Zalewski&#xff08;lcamtuf&#xff09;开发的一款 基于覆盖引导&#xff08;Coverage-guided&#xff09;的 模糊测试工具&#xff0…...

PaddleOCR学习笔记1-初步尝试

尝试使用PaddleOCR方法&#xff0c;如何使用自定义的模型方法&#xff0c;参数怎么配置&#xff0c;图片识别尝试简单提高识别率方法。 目前仅仅只是初步学习下如何使用PaddleOCR的方法。 一&#xff0c;测试识别图片&#xff1a; 1.png : 正确文本内容为“哲学可以帮助辩别现…...

ExpressLRS开源代码之框架结构

ExpressLRS开源代码之框架结构 1. 源由2. Arduino应用框架3. ExpressLRS应用框架4. 硬件设计框架4.1 单天线4.2 双天线单PA4.3 双天线双PA 5. 应用软件设计6. 参考资料 1. 源由 最近为了理解《ExpressLRS开源之基本调试数据含义》&#xff0c;做了一些源代码的研读。 概念、文…...

【C++ • STL】一文带你走进string

文章目录 一、STL简介二、标准库中的string类三、string类的常用接口说明2.1 string类对象的常见构造2.2 string类对象的访问及遍历操作2.2.1 元素访问2.2.2 迭代器 2.3 string类对象的容量操作2.4 string类对象的修改操作2.5 string类非成员函数 四、总结 ヾ(๑╹◡╹)&#x…...

GPT引领前沿热点、AI绘图

GPT对于每个科研人员已经成为不可或缺的辅助工具&#xff0c;不同的研究领域和项目具有不同的需求。如在科研编程、绘图领域&#xff1a; 1、编程建议和示例代码: 无论你使用的编程语言是Python、R、MATLAB还是其他语言&#xff0c;都可以为你提供相关的代码示例。 2、数据可…...

ArcGIS Pro3.0.2保姆级安装教程

软件简介&#xff1a; ArcGIS Pro是ERSI推出的新一代原生态64位ArcGIS桌面产品。具备强大的二维、三维一体化功能&#xff0c;继承了传统桌面产品ArcMap等产品几乎所有的功能&#xff0c;并在多个方面作了进一步的优化和改进&#xff0c;是云端一体化、数据科学与空间数据科学…...

如何才能搭建高质量的在线产品手册呢?

随着科技的发展&#xff0c;越来越多的企业将目光投向互联网&#xff0c;并将自己的产品推向了线上。而对于这些线上产品&#xff0c;拥有一份完备的、易用、高质量的在线产品手册显得尤为重要。 如何才能搭建高质量的在线产品手册呢&#xff1f; 一、确定手册的内容和格式 …...

从零开始学习软件测试-第38天笔记

接口测试 什么是接口 接口是两个独立部件共享信息的边界&#xff0c;测试中常说的接口大部分是web接口。web接口是遵循了http或者https协议的URL。 数据的流转过程 由客户端通过接口将数据发送给服务器。服务器收到数据之后&#xff0c;取出想要的数据&#xff0c;拼装成一…...

ASP.NET Core 8 的 Web App

Web App Web App 与 Web API 的不同之处在于包含 UI 部分&#xff0c;所谓的 UI 就是 HTML 页面。 Web App 支持几种渲染HTML 的方式&#xff1a; 服务端渲染客户端渲染混合渲染 服务端渲染 服务端渲染UI是在浏览器请求的时候&#xff0c;服务端生成 HTML&#xff0c;然后返…...

jeesite自定义数据字典,自定义字典表,自带树选择数据源(保姆级图文教程)

文章目录 前言一、框架自带树字典表如何使用二、自定义表作为字典表1. 下拉选项使用自建表作为字典表。实际效果框架示例实际开发代码2. 结构树选择使用自建表作为字典表。效果展示实际开发代码总结前言 项目开发中字典表如果不满足实际需求,比如使用自己的表作为字典,系统自…...

基于v-md-editor的在线文档编辑实现

概述 前面的文章讲到了基于语雀的在线文档编辑器的实现&#xff0c;在本文&#xff0c;将基于v-md-editor实现在线文档的编辑。 实现后效果 实现 说明&#xff1a;本文是基于Vue3实现的&#xff0c;实现了&#xff1a;1.Markdown的在线编辑和预览&#xff1b;2. 文件的上传和…...

C(结构体指针、利用结构体指针偏移获取数据)

记录问题&#xff0c;还没有研究明白 struct MY_STRUCT{int a;short b;char s[100];double d; }; int main(){ MY_STRUCT s{1,2,"he",999};MY_STRUCT* struct_ptr &s;char *char_p (char *) &s.s;int *int_ap &s.a;short * int_bp &s.b;double …...

数据结构和算法之插入排序

一、插入排序 插入排序是一种简单直观的排序算法。它的原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。 #mermaid-svg-v2YbPqchr8qWCPvn {font-family:"trebuchet ms",verdana,arial,san…...

感应电动机

引言 感应电动机,这个名字对于普通人来说可能有些陌生,但它在我们的日常生活和工作中占据着举足轻重的地位。从各类电器设备到工业生产设备,感应电动机的应用广泛而深入。了解感应电动机的种类和主要结构有助于我们更好地理解其工作原理,从而为我们的生活和工作带来更多便利…...

AjaxJavaScriptcss模仿百度一下模糊查询功能

1、效果 如下图所示&#xff0c;我们在输入大学时&#xff0c;程序会到后端查询名字中包含大学的数据&#xff0c;并展示到前端页面。 用户选择一个大学&#xff0c;该大学值会被赋值到input表单&#xff0c;同时关闭下拉表单&#xff1b; 当页面展示的数据都不符合条件时&…...

sqli-labs复现

sqli-labs第一关复现 环境搭建下载phpstudy下载sqli-labs浏览器加载 第一关复现 环境搭建 下载phpstudy phpstudy是一个可以快速帮助我们搭建web服务器环境的软件 官网&#xff1a;https://www.xp.cn/ 这里我选择的是windows 64bit 客户端版本&#xff0c;安装路径为C:\php…...

k8s入门到实战--跨服务调用

service.png 背景 在做传统业务开发的时候&#xff0c;当我们的服务提供方有多个实例时&#xff0c;往往我们需要将对方的服务列表保存在本地&#xff0c;然后采用一定的算法进行调用&#xff1b;当服务提供方的列表变化时还得及时通知调用方。 student: url: - 192.168.1…...

小程序中使用分包

前言 小程序在未使用的分包的情况下仅支持大小为2M,如果图片等资源过多的情况下可以使用分包功能&#xff0c;使用分包的情况下单个分包大小不能超过2M,总大小不能超过20M&#xff0c;分包有两种情况&#xff1a;普通分包和独立分包&#xff0c;下面介绍的是普通分包。官方文档…...

python官方标准库

文章目录 1. 标准库2. Python标准库介绍3. 示例 1. 标准库 https://docs.python.org/zh-cn/3/library/ https://pypi.org/ 2. Python标准库介绍 Python 语言参考手册 描述了 Python 语言的具体语法和语义&#xff0c;这份库参考则介绍了与 Python 一同发行的标准库。它还描…...

Python Opencv实践 - 霍夫圆检测(Hough Circles)

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/steelpipes.jpg") print(img.shape) plt.imshow(img[:,:,::-1])#转为二值图 gray cv.cvtColor(img, cv.COLOR_BGR2GRAY) plt.imshow(gray, cmap plt.cm.gray…...

异步请求库的实际应用案例:爬取豆瓣经典电影

在日常爬虫过程中&#xff0c;你有没有遇到过需要爬取大量数据的情况&#xff0c;但是传统的同步请求方式让您等得焦头烂额&#xff1f; 这个问题的根源在于传统的同步请求方式。当我们使用同步请求时&#xff0c;程序会一直等待服务器的响应&#xff0c;直到数据返回后才能继续…...

数据结构学习系列之两个单向链表的合并

两个单向链表的合并&#xff1a;创建两个单向链表p1和p2&#xff0c;合并p1和p2即可&#xff0c;代码如下&#xff1a;示例代码&#xff1a; int merge_2_link_list(node_t *p1,node_t **p2){if(NULL p1 || NULL p2 || NULL *p2){printf("入参合理性检查\n");ret…...

java网络编程,套接字socket

目录 一 网络概述 二 网络的类型分类 三 网络体系结构 四 网络通信协议概述 五 网络通信协议种类 六 Socket简介 七 Socket路径 八 java网络编程三要素 九 基于UDP协议的Socket编程 十 基于TCP协议的Socket编程 十一 基于TCP协议和UDP的区别 一 网络概述 多台相互连…...

一日一技:Python如何同时调用多个GPT的API?

相信很多同学或多或少都在Python中使用过GPT API&#xff0c;通过Python安装openai库&#xff0c;来调用GPT模型。 OpenAI官方文档中给出了一个示例&#xff0c;如下图所示&#xff1a; OpenAI API 测试 如果你只有一个API账号&#xff0c;那么你可能不觉得这样写有什么问题。…...

【云原生】Docker环境安装

文章目录 一、安装准备1、前提条件2、查看系统内核3、查看已安装的CentOS版本信息 二、CentOS7安装docker1、安装需要的软件包2、设置docker下载镜像3、更新yum软件包索引4、安装docker ce5、启动docker6、版本验证7、设置开机启动 三、卸载 Docker 是一个开源的应用容器引擎&a…...

56、springboot ------ RESTful服务及RESTful接口设计

★ RESTful服务 RESTful服务是“前后端分离”架构中的主要功能&#xff1a; 后端应用对外暴露RESTful服务&#xff0c;前端应用则通过RESTful服务与后端应用交互。后端应用 RESTful接口 <------------------> 前端★ 基于JSON的RESTful服务 使用RestController注解…...

sysmonitor如何使用

Sysmonitor是一个系统监控工具&#xff0c;可以监视系统资源的使用情况&#xff0c;如CPU、内存、磁盘、网络等。以下是使用Sysmonitor的步骤&#xff1a; 打开终端或命令行界面&#xff0c;输入以下命令安装Sysmonitor&#xff1a; sudo apt-get install sysmonitor安装完成…...

视频监控/视频汇聚/安防视频监控平台EasyCVR如何将默认快照的raw格式改为jpg/base64格式?

视频监控/视频汇聚/安防视频监控平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。视频云存储EasyCVR平台能在复…...

QRCode.js生成的二维码水平居中的解决方案

在使用qrcode.js库生成二维码&#xff0c;并希望生成的二维码能够在其容器中居中。 以下是一个简单的例子&#xff0c;它展示了如何使用qrcode.js生成二维码&#xff0c;并通过CSS将其居中&#xff1a; HTML代码 <div id"qrcode-container"><div id"…...

在Cisco设备上配置接口速度和双工

默认情况下&#xff0c;思科交换机将自动协商速度和双工设置。将设备&#xff08;交换机、路由器或工作站&#xff09;连接到 Cisco 交换机上的端口时&#xff0c;将发生协商过程&#xff0c;设备将就传输参数达成一致&#xff0c;当今的大多数网络适配器都支持此功能。 在本文…...