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

AF_UNIX和127.0.0.1(AF_INET)回环地址写数据速度对比

在linux下,存在着这样的情况,本地的进程间通信,并且其中一个是服务端,另外的都是客户端。
服务端通过绑定端口,客户端往127.0.0.1的对应端口发送,即可办到,不过这样会浪费一个端口,同时也容易造成安全隐患。

今天发现linux服务端创建socket的时候,协议族用AF_UNIX即可,AF_LOCAL和AF_UNIX的值是一样的。

而AF_UNIX和127.0.0.1回环地址相比,具有哪些好处呢。本人读了下面博客:
Unix domain socket 简介

其中里面讲到UNIX domain socket 用于 IPC 更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等。本人想当然认为AF_UNIX速度比127.0.0.1更快,为此鄙人进行了实验。

找一个比较大的文件,超过1G大小,然后
1。用AF_UNIX写客户端和服务端,由客户端读取文件,发送给AF_UNIX服务端,然后服务端写文件,看看用AF_UNIX传递一个文件需要多久。
2. 用127.0.0.1写客户端和服务端,由客户端读取文件,发送给127.0.0.1服务端,然后服务端写文件,看看用127.0.0.1传递一个文件需要多久。

废话不多说,直接上代码,先上AF_UNIX的:
AF_UNIX服务端(unixsocketserver.c):

#include <stdlib.h>  
#include <stdio.h>  
#include <stddef.h>  
#include <sys/socket.h>  
#include <sys/un.h>  
#include <errno.h>  
#include <string.h>  
#include <unistd.h>  
#include <ctype.h>   #define MAXLINE 80  char *socket_path = "/tmp/server.socket";  #define RECV_LEN 1000int main(void)  
{  fd_set readmask, exceptmask;struct timeval tv;int maxfd = FD_SETSIZE;int nready = 0;FILE *fp = fopen("/tmp/pull_desktop234_copy.flv", "w");if(fp == NULL){perror("fopen pull_desktop234_copy.flv failed");goto end;} char buf[RECV_LEN + 1];int readbyte, writebyte;struct sockaddr_un serun, cliun;  socklen_t cliun_len;  int listenfd, connfd, size;  if ((listenfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {  perror("socket error");  exit(1);  }  memset(&serun, 0, sizeof(serun));  serun.sun_family = AF_UNIX;  strcpy(serun.sun_path, socket_path);  size = offsetof(struct sockaddr_un, sun_path) + strlen(serun.sun_path);  unlink(socket_path);  if (bind(listenfd, (struct sockaddr *)&serun, size) < 0) {  perror("bind error");  exit(1);  }  printf("UNIX domain socket bound\n");  if (listen(listenfd, 20) < 0) {  perror("listen error");  exit(1);          }  printf("Accepting connections ...\n");  cliun_len = sizeof(cliun);         if ((connfd = accept(listenfd, (struct sockaddr *)&cliun, &cliun_len)) < 0){  perror("accept error");  goto end;  }time_t now, endtime;now = time(NULL);while(1){FD_ZERO(&readmask);FD_ZERO(&exceptmask);FD_SET(connfd, &readmask);FD_SET(connfd, &exceptmask);tv.tv_sec = 3;tv.tv_usec = 0;nready = select(maxfd, &readmask, NULL, &exceptmask, &tv);if(nready < 0){goto end;}if(nready == 0){printf("nready == 0\n");continue;}if(FD_ISSET(connfd, &readmask)){readbyte = recv(connfd, buf, RECV_LEN, 0);if(readbyte < 0){perror("readbyte < 0");goto end;}if(readbyte == 0){perror("readbyte == 0");goto end;}if(readbyte > 0){buf[readbyte] = 0;writebyte = fwrite(buf, 1, readbyte, fp);if(writebyte != readbyte){printf("writebyte(%d) != readbyte(%d)\n", writebyte, readbyte);goto end;}}}if(FD_ISSET(connfd, &exceptmask)){printf("select, exceptmask\n");goto end;}}  
end:endtime = time(NULL);printf("costs %d seconds\n", endtime - now);if(fp != NULL){fclose(fp);fp = NULL;}	close(connfd);close(listenfd);  return 0;  
}

AF_UNIX客户端(unixsocketclient.c):

#include <stdlib.h>  
#include <stdio.h>  
#include <stddef.h>  
#include <sys/socket.h>  
#include <sys/un.h>  
#include <errno.h>  
#include <string.h>  
#include <unistd.h>  #define SEND_LEN 1000char *client_path = "/tmp/client.socket";  
char *server_path = "/tmp/server.socket";  int main() {  struct  sockaddr_un cliun, serun;  int len;   int sockfd, n;  FILE *fp = fopen("/tmp/pull_desktop234.flv", "r");if(fp == NULL){perror("fopen pull_desktop234.flv failed");goto end;}   if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){  perror("client socket error");  exit(1);  }  // 一般显式调用bind函数,以便服务器区分不同客户端  memset(&cliun, 0, sizeof(cliun));  cliun.sun_family = AF_UNIX;  strcpy(cliun.sun_path, client_path);  len = offsetof(struct sockaddr_un, sun_path) + strlen(cliun.sun_path);  unlink(cliun.sun_path);  if (bind(sockfd, (struct sockaddr *)&cliun, len) < 0) {  perror("bind error");  exit(1);  }  memset(&serun, 0, sizeof(serun));  serun.sun_family = AF_UNIX;  strcpy(serun.sun_path, server_path);  len = offsetof(struct sockaddr_un, sun_path) + strlen(serun.sun_path);  if (connect(sockfd, (struct sockaddr *)&serun, len) < 0){  perror("connect error");  exit(1);  }  int sendbyte = 0;int alreadysendbyte = 0;char buf[SEND_LEN + 1];while((n = fread(buf, 1, SEND_LEN, fp)) > 0){sendbyte = send(sockfd, buf, n, 0);if(sendbyte == -1){perror("send error");goto end;}alreadysendbyte += sendbyte;while(alreadysendbyte < n){sendbyte = send(sockfd, buf + alreadysendbyte, n - alreadysendbyte, 0);if(sendbyte == -1){perror("send error");goto end;}alreadysendbyte += sendbyte;}}
end:if(fp != NULL){fclose(fp);fp = NULL;}close(sockfd);return 0;  
}

接着上127.0.0.1的:
127.0.0.1服务端(loopsocketserver.c):

#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>#define RECV_LEN 1000int main(){fd_set readmask, exceptmask;struct timeval tv;int maxfd = FD_SETSIZE;int nready = 0;FILE *fp = fopen("/tmp/pull_desktop234_copy.flv", "w");if(fp == NULL){perror("fopen pull_desktop234_copy.flv failed");goto end;} char buf[RECV_LEN + 1];int readbyte, writebyte;int serv_sock=socket(AF_INET,SOCK_STREAM,0);struct sockaddr_in serv_addr;memset(&serv_addr,0,sizeof(serv_addr));serv_addr.sin_family=AF_INET;serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);serv_addr.sin_port=htons(9990);bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr));listen(serv_sock,5);struct sockaddr_in clnt_addr;socklen_t clnt_addr_size=sizeof(clnt_addr);int clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_addr,&clnt_addr_size);time_t now, endtime;now = time(NULL);while(1){FD_ZERO(&readmask);FD_ZERO(&exceptmask);FD_SET(clnt_sock, &readmask);FD_SET(clnt_sock, &exceptmask);tv.tv_sec = 3;tv.tv_usec = 0;nready = select(maxfd, &readmask, NULL, &exceptmask, &tv);if(nready < 0){goto end;}if(nready == 0){printf("nready == 0\n");continue;}if(FD_ISSET(clnt_sock, &readmask)){readbyte = recv(clnt_sock, buf, RECV_LEN, 0);if(readbyte < 0){perror("readbyte < 0");goto end;}if(readbyte == 0){perror("readbyte == 0");goto end;}if(readbyte > 0){buf[readbyte] = 0;writebyte = fwrite(buf, 1, readbyte, fp);if(writebyte != readbyte){printf("writebyte(%d) != readbyte(%d)\n", writebyte, readbyte);goto end;}}}if(FD_ISSET(clnt_sock, &exceptmask)){printf("select, exceptmask\n");goto end;}}
end: endtime = time(NULL);printf("costs %d seconds\n", endtime - now);if(fp != NULL){fclose(fp);fp = NULL;}close(clnt_sock);close(serv_sock);return 0;
}

127.0.0.1客户端(loopsocketclient.c):

#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<string.h>
#include <errno.h>
#include <stdlib.h>#define SEND_LEN 1000int main(){int sock=socket(AF_INET,SOCK_STREAM,0);FILE *fp = fopen("/tmp/pull_desktop234.flv", "r");if(fp == NULL){perror("fopen pull_desktop234.flv failed");goto end;}   int n = 0;struct sockaddr_in serv_addr;memset(&serv_addr,0,sizeof(serv_addr));serv_addr.sin_family=AF_INET;serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");serv_addr.sin_port=htons(9990);if(connect(sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) < 0){perror("connect failed");goto end;}int sendbyte = 0;int alreadysendbyte = 0;char buf[SEND_LEN + 1];while((n = fread(buf, 1, SEND_LEN, fp)) > 0){sendbyte = send(sock, buf, n, 0);if(sendbyte == -1){perror("send error");goto end;}alreadysendbyte += sendbyte;while(alreadysendbyte < n){sendbyte = send(sock, buf + alreadysendbyte, n - alreadysendbyte, 0);if(sendbyte == -1){perror("send error");goto end;}alreadysendbyte += sendbyte;}}
end:if(fp != NULL){fclose(fp);fp = NULL;}close(sock);return 0;
}

本人的缓冲区大小分为3种情况(文件大小为1.15G),上图代码片段缓冲区大小为1000字节:
缓冲区大小100字节:AF_UNIX传递完文件费时25秒,127.0.0.1传递完文件费时33秒
缓冲区大小1000字节:AF_UNIX传递完文件费时8秒,127.0.0.1传递完文件费时7秒
缓冲区大小10000字节:AF_UNIX传递完文件费时5秒,127.0.0.1传递完文件费时4秒

相关文章:

AF_UNIX和127.0.0.1(AF_INET)回环地址写数据速度对比

在linux下&#xff0c;存在着这样的情况&#xff0c;本地的进程间通信&#xff0c;并且其中一个是服务端&#xff0c;另外的都是客户端。 服务端通过绑定端口&#xff0c;客户端往127.0.0.1的对应端口发送&#xff0c;即可办到&#xff0c;不过这样会浪费一个端口&#xff0c;同…...

我在 NPM 发布了新包: con-colors

链接地址&#xff1a;npmjs.com con-colors 安装依赖 yarn add con-colors使用 导入&#xff1a; import { print } from "con-colors";使用&#xff1a; print.succ("成功的消息"); print.err("失败的消息")例子&#xff1a; import { p…...

【python数据建模】Scipy库

常用模块列表 模块名功能scipy.constants数学常量scipy.fft离散傅里叶变换scipy.integrate积分scipy.interpolate插值scipy.interpolate线性代数scipy.cluster聚类分析、向量量化scipy.io数据输入输出scipy.misc图像处理scipy.ndimagen维图像scipy.odr正交距离回归scipy.optim…...

C# App.xaml.cs的一些操作

一、保证只有一个进程 1.1 关闭旧的&#xff0c;打开新的 protected override void OnStartup(StartupEventArgs e) {base.OnStartup(e);var process Process.GetProcessesByName("Dog");if (process.Count() > 1) {var list process.ToList();list.Sort((p1,p2…...

【ORACLE】ORA-00972:标识符过长

问题 执行创建表结构sql&#xff0c;提示 ORA-00972&#xff1a;标识符过长&#xff1b; 如图所示&#xff0c;约束名称超过30个字符了 原因 一、11G and before 在使用11G数据库时&#xff0c;经常会遇到报错ORA-00972&#xff0c;原因是因为对象名称定义太长&#xff0c…...

【Vue】Vue快速入门、Vue常用指令、Vue的生命周期

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Vue 一、 Vue快速入门二、Vue常用指令2.1 v…...

Pandas 数据处理 类别数据和数值数据

要是作深度学习的话&#xff0c;可以直接用tensoflow框架的预处理层&#xff0c;我试过&#xff0c;比PyTorch自己写出来的会好一点&#xff0c;主要是简单好用。处理CSV文件 它类别的处理逻辑是onehot&#xff0c;比较标准稀疏&#xff0c;数值的话就是归一化了。 有时候不需…...

Android攻城狮学鸿蒙 -- 点击事件

具体参考&#xff1a;华为官网学习地址 1、点击事件&#xff0c;界面跳转 对于一个按钮设置点击事件&#xff0c;跳转页面。但是onclick中&#xff0c;如果pages前边加上“/”&#xff0c;就没法跳转。但是开发工具加上“/”才会给出提示。不知道是不是开发工具的bug。&#…...

jmeter性能测试常见的一些问题

一、request 请求超时设置 timeout 超时时间是可以手动设置的&#xff0c;新建一个 http 请求&#xff0c;在“高级”设置中找到“超时”设置&#xff0c;设置连接、响应时间为2000ms。 1. 请求连接超时&#xff0c;连不上服务器。 现象&#xff1a; Jmeter表现形式为&#xff…...

利用国外 vps 为 switch 设置代理服务器加速游戏下载

switch 在国内通过 wifi 连网后如果直接下载游戏的话速度特别慢&#xff0c;据说要挂一个晚上才能下载成功一个游戏。当我尝试下载时发现进度条基本不动&#xff0c;怀疑软件源是在国外的原因&#xff0c;于是想到可以通过国外 vps 代理中转的方式。具体步骤如下&#xff08;以…...

云计算安全的新挑战:零信任架构的应用

文章目录 云计算的安全挑战什么是零信任架构&#xff1f;零信任架构的应用1. 多因素身份验证&#xff08;MFA&#xff09;2. 访问控制和策略3. 安全信息和事件管理&#xff08;SIEM&#xff09;4. 安全的应用程序开发 零信任架构的未来 &#x1f389;欢迎来到云计算技术应用专栏…...

基于SSM的药房药品采购集中管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

【GIT版本控制】--远程仓库

一、连接远程仓库 连接到远程仓库是在GIT中进行协作和备份的关键步骤。以下是连接到远程仓库的基本步骤&#xff1a; 获取远程仓库的URL&#xff1a;首先&#xff0c;你需要获得远程仓库的URL。通常&#xff0c;这是远程仓库提供给你的&#xff0c;可以是HTTPS或SSH URL。例如…...

1:Allotment,2:FeeSell,3:混合Allotment+FreeSell

根据您的描述&#xff0c;这似乎是与酒店预订相关的三种不同的方式。下面是对这三种方式的解释&#xff1a; Allotment&#xff08;配额&#xff09;&#xff1a;这是一种酒店预订方式&#xff0c;其中您可以与酒店签订协议&#xff0c;并购买其一定数量的房间或床位。在此之后…...

NFT Insider#110:The Sandbox与TB Media Global合作,YGG Web3游戏峰会阵容揭晓

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members、BeepCrypto出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据&#xff0c;艺术新闻类&#xff0c;游戏新闻类&#xff0c;虚拟世界类&#xff0…...

在硅云上主机搭建wordpress并使用Astra主题和avada主题

目录 前言 准备 操作 DNS解析域名 云主机绑定域名 安装wordpress网站程序 网站内Astra主题设计操作 安装主题 网站内avada主题安装 上传插件 上传主题 选择网站主题 前言 一开始以为云虚拟主机和云服务器是一个东西&#xff0c;只不过前者是虚拟的后者是不是虚拟的…...

基于SSM+Vue的物流管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;VueHTML 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 …...

【洛谷】P1114 “非常男女”计划

思路&#xff1a;思路和上一篇一模一样哒~&#xff08;这里就不多解释啦&#xff09; ACcode: #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N 2e510; int n,a[N],f[N]; int main() { ios::sync_with_st…...

list中符合 多条件中筛选符合条件的值

//查找身高在1.8米及以上的男生 // List<SsxlwdBean> boys list.stream().filter(s->s.getGender() && s.getHeight() > 1.8).collect(Collectors.toList()); xlseachitem list.stream().filter(list->list.xlname.contains(Upstrquery)||list.xlbm.…...

Amber中的信息传递——章节1.2-第三部分

程序列表 Amber 包含大量旨在帮助您进行化学系统计算研究的程序&#xff0c;而且发布的工具数量还在定期增加。 本节列出了 AmberTools 包含的主要程序。 这里列出了套件中包含的每个程序&#xff0c;并简要介绍了其主要功能&#xff0c;同时提供了相关文档参考。 对于大多数程…...

【嵌入式】常用串口协议与转换芯片详解

文章目录 0 前言1 一个通信的协议的组成2 常用协议名词解释2.1 UART2.2 RS-2322.3 RS-4852.4 RS-422 3 常用的芯片3.1 MAX2323.2 CP21023.3 CH3403.4 FT232 0 前言 最近有点想研究USB协议&#xff0c;正好也看到有评论说对如何选择USB转串口模块有些疑惑&#xff0c;其实我也一…...

缓存与数据库双写一致性问题解决方案

其实如果使用缓存&#xff0c;就会出现缓存和数据库的不一致问题&#xff0c;关键在于我们可以接受不一致的时间是多少&#xff0c;根据不同的需求采取不同的实现方案。 第一种&#xff1a;先更新数据库后更新缓存 做法简单&#xff0c;但是并发写情况下&#xff0c;会出现数…...

Java中的transient关键字是什么意思?

Java中的transient关键字是什么意思&#xff1f; 在Java中&#xff0c;transient 是一个关键字&#xff0c;用于修饰实例变量&#xff08;成员变量&#xff09;。当一个实例变量被声明为transient 时&#xff0c;它的值不会被持久化&#xff08;即不会被序列化&#xff09;。 …...

内存溢出和内存泄漏

内存溢出和内存泄漏 内存溢出 内存溢出相对于内存泄漏来说&#xff0c;尽管更容易被理解&#xff0c;但是同样的&#xff0c;内存溢出也是引发程序崩溃的罪魁祸首之一。由于GC一直在发展&#xff0c;所以一般情况下&#xff0c;除非应用程序占用的内存增长速度非常快&#xf…...

Java数组:没错,不装了我就是书架。

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、数组的概念1、什么是数组&#xff1f;2、数组的创建3、数组的初始化Ⅰ、动态初始化Ⅱ、静态初始化 二、数组的使用1、数组中…...

轻量级接口自动化测试框架

大致思路: jmeter完成接口脚本,Ant完成脚本执行并收集结果生成报告,最后利用jenkins完成脚本的自动集成运行. 环境安装: 1.jdk1.7 配置环境变量(参考前面的分页) 2.jmeter解压到本地,ant解压到本地 3.Ant解压到本地,并配置环境变量 ANT_HOME:D:\jmeter\apache-ant-1.9.6 P…...

.some方法、vh、多列布局、DNS域名解析过程、空页面文字内容渲染

nodeEndTime.some((time) > !!time&#xff09; 这个方法主要用来判断nodeEndTime这个数组中是否有至少一个非假值的元素。它会遍历 nodeEndTime 数组中的每个元素&#xff0c;如果至少有一个元素是真值&#xff08;不是 null、undefined、0、false 或空字符串等假值&#x…...

Eclipse iceoryx™ - 真正的零拷贝进程间通信

1 序言 通过一个快速的背景教程&#xff0c;介绍项目范围和安装所需的所有内容以及第一个运行示例。 首先&#xff1a;什么是冰羚&#xff1f; iceoryx是一个用于各种操作系统的进程间通信&#xff08;IPC&#xff09;中间件&#xff08;目前我们支持Linux、macOS、QNX、FreeBS…...

【C++】面向对象编程(二)面向对象的编程思维:virtual虚拟调用、继承、protected成员、派生类与基类

默认情形下&#xff0c;成员函数的解析都是编译时静态进行。如果要让成员函数的解析在程序运行时动态进行&#xff0c;需要在成员函数的声明前加上关键字virtual&#xff1a; //LibMat声明表示&#xff0c;其析构函数和print()函数皆为虚函数 class LibMat{ public:LibMat(){c…...

【古谷彻】算法模板(更新ing···)

目录 一、数学 1、逆元 (一)费马小定理/欧拉定理(快速幂) 2、组合数 (1)求组合数C(n,m) 方法一:阶乘+逆元+快速幂求组合数 方法二:记忆化搜索 方法三:递推公式 (2)组合数求概率 3、高精度sqrt (1)二分法 (2)递加递减 4、快速幂 5、欧拉函数 方法一:…...

Day-06 基于 Docker 安装 Nginx 镜像

1.去官方公有仓库查询nginx镜像 docker search nginx 2.拉取该镜像 docker pull nginx 3. 启动镜像&#xff0c;使用nginx服务&#xff0c;代理本机8080端口(测试是不是好使) docker run -d -p 8080:80 --name nginx-8080 nginx docker ps curl 127.0.0.1:8080...

k8s集群-7 service

工作负载的应用是如何暴露出去的 解决访问问题 Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service&#xff0c;应用可以方便地实现服务发现和负载均衡。 service默认只支持4层负载均衡能力&#xff0c;没有7层功能。(可以通过Ingress实现) service的类型: C…...

JS进阶-防抖和节流

防抖&#xff08;debounce&#xff09; 单位时间内&#xff0c;频繁触发事件&#xff0c;只执行最后一次。 例子&#xff1a;王者荣耀回城&#xff0c;只要被打断就需要重新来 使用场景&#xff1a; 1&#xff09;搜索框搜索输入。只需用户最后一次输入完&#xff0c;再发送…...

踩坑日记 uniapp 底部 tabber遮挡住购物车结算

tabbar 被购物车结算遮挡 在小程序上tabbar没有将固定栏遮挡&#xff0c;如果直接调高&#xff0c;浏览器H5页面是对了&#xff0c;但在小程序上面离底部的定位就太高了 原代码 // 底部结算样式.shop-foot {border-top: 2rpx solid #F7F7F7;background-color: #FFF;position: …...

【MySQL】表的约束(一)

文章目录 为什么要有约束一. 空属性二. 默认值三. 列描述四. zerofill结束语 为什么要有约束 数据库是用来存放数据的&#xff0c;所以其需要保证数据的完整性和可靠性 数据类型也算是一种约束&#xff0c;比如&#xff0c;整型的数据无法插入字符型。 通过约束&#xff0c;让…...

Excel宏管理库存清单

1. 开启宏: - 打开 Excel - 选择 “文件” > “选项” > “自定义功能区” > “开发工具” &#xff0c;将其添加到功能区。 - 返回Excel界面&#xff0c;点击 “开发工具” 选项卡。 2.准备你的库存清单&#xff1a; - 在一个新的工作表中创建你的库存清单。…...

C语言练习百题之排序算法

题目:C语言实现排序算法 冒泡排序 思路&#xff1a; 依次比较相邻的元素&#xff0c;如果顺序不对则交换&#xff0c;直到整个数组有序。 实现代码&#xff1a; #include <stdio.h>void bubbleSort(int arr[], int n) {for (int i 0; i < n - 1; i) {for (int j…...

通过ElementUi在Vue搭建的项目中实现CRUD

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Vue》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这个专栏…...

【CSS如何进行圣杯布局】

圣杯布局是一种经典的三栏布局&#xff0c;其中中间的主栏宽度自适应&#xff0c;两侧的边栏宽度固定。实现圣杯布局可以使用CSS中的浮动、定位、负边距等属性。 以下是一种实现圣杯布局的方法&#xff1a; HTML结构&#xff1a; <div class"container"><…...

flex 实现的圣杯布局

关键点 通过 margin-left 与 left 属性将左右两列放置到准确的位置; 父元素需要设置 padding; margin-left 取值为百分比时,是以其父元素的宽度为基准的;和双飞翼不同的地方 圣杯布局的的左中右三列容器没有多余子容器存在,通过控制父元素的 padding 空出左右两列的宽度。…...

数字人直播软件排名推荐,铭顺科技数字人品牌抢占“日不落”流量新技能

在今年的618中&#xff0c;相信大家能明显感受到&#xff0c;现如今已经有越来越多的品牌商都在使用AI营销工具&#xff0c;如AI营销工具、AI电话、AI虚拟主播。据京东战报显示&#xff0c;在今年的618中&#xff0c;使用AI数字人直播比去年双11增幅近5倍。 7*24小时不间断直播…...

【AI视野·今日Robot 机器人论文速览 第四十五期】Mon, 2 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Mon, 2 Oct 2023 Totally 42 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;PONG, Probabilistic Object Normals for Grasping 用于抓取的概率目标归一化&#xff0c;根据目标表面法向量获取的不确定…...

【计算机网络】网络编程接口 Socket API 解读(9)

Socket 是网络协议栈暴露给编程人员的 API&#xff0c;相比复杂的计算机网络协议&#xff0c;API 对关键操作和配置数据进行了抽象&#xff0c;简化了程序编程。 本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍&#xff0c;从而更好的理解 socket 编程。…...

用户端App自动化测试

一、capability 进阶用法 1、 deviceName 只是设备的名字&#xff0c;别名随便起不能锁定唯一一个设备 2、 uid 多设备选择的时候&#xff0c;要指定 uid默认读取设备列表的第一个设备设备列表获取 adb devices 3、 newCommandTimeout appium 程序应等待来自客户端的新命…...

[洛谷]P2697 宝石串(经典好题!)

思路&#xff1a; 对于一个类似的东西进行前缀和&#xff1a; G R G G R G G&#xff1a;1 1 2 3 3 4 R&#xff1a;0 1 1 1 2 2 差&#xff1a;1 0 1 2 1 2 所得关于差的数列&#xff0c;同样的数最左最右的位置差为一个答案&#xff0c;选取最大的答案即为解&#xff0…...

毫米波汽车雷达测试应用指南

汽车毫米波雷达测试背景 车载毫米波雷达通过天线向外发射毫米波&#xff0c;接收目标反射信号&#xff0c;经后方处理后快速准确地获取汽车车身周围的物理环境信息&#xff08;如汽车与其他物体之间的相对距离、相对速度、角度、运动方向等&#xff09;&#xff0c;然后根据所…...

抖音账号矩阵系统开发源码----技术研发

一、技术自研框架开发背景&#xff1a; 抖音账号矩阵系统是一种基于数据分析和管理的全新平台&#xff0c;能够帮助用户更好地管理、扩展和营销抖音账号。 抖音账号矩阵系统开发源码 部分源码分享&#xff1a; ic function indexAction() { //面包屑 $breadc…...

C++ 33.学习C++的意义-狄泰软件学院

一些历史 UNIX操作系统诞生之初是直接用汇编语言编写的随着UNIX系统的发展&#xff0c;汇编语言的开发效率成为瓶颈&#xff0c;所以需要一个新的语言替代汇编语言1971年通过对B语言改良&#xff0c;使其能直接产生机器代码&#xff0c;C语言诞生UNIX使用C语言重写&#xff0c…...

[C++基础]-多态

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 本期学习目标&am…...

【Kubernetes】当K8s出现问题时,我们可以从哪些方面排查出

前言 kubernetes&#xff0c;简称K8s&#xff0c;是用8代替名字中间的8个字符“ubernete”而成的缩写。是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;Kubernetes的目标是让部署容器化的应用简单并且高效&#xff08;powerful&#xff09;,Kub…...