网络编程UDP—socket实现(C++)
网络编程UDP—socket实现
- 前言
- UDP客户端和服务端
- UDP使用场景
- UDP socket C++代码示例
- 服务端接收数据示例(bind+recvfrom 阻塞式接收信息):
- bind 绑定-监听 函数
- 为什么一般都是监听所有网络接口呢?
- 为什么需要用inet_addr进行转换?
- socket函数
- sockaddr_in结构体
- recvfrom 函数
- 客户端发送数据示例:
- sendto 发送 函数
前言
-
UDP通信需要哪些必要信息
- IP地址
- 用于定位通讯双方
- 端口号
- 用于标识通信的具体应用或服务。
- 传输层通信都需要端口号的。
- IP地址
-
网络要求
- 双方必须是可以进行ip通信的
- UDP依赖IP协议栈(IPv4或IPv6)完成路由、传输
- 双方需要用同一协议
- 双方必须是可以进行ip通信的
UDP客户端和服务端
-
客户端
-
构造数据报:包含目标IP、目标端口、数据内容。
-
发送数据报:使用套接字 sendto() 函数将数据发送到目标地址。
-
等待响应(如果有):接收服务端返回的数据。
-
服务端
-
创建监听套接字:绑定到指定IP和端口。
-
等待数据:通过 recvfrom() 函数接收数据。
-
处理请求:解析数据内容并执行相应操作。
-
返回响应:将结果数据发送回客户端。
UDP使用场景
UDP适用于以下需要高效传输但容忍数据丢失的场景:
- 实时通信:
- 视频通话、语音通话(如VoIP)。
- 在线游戏:
- 游戏中快速同步状态。
- 流媒体传输:
- 实时视频、音频传输。
- 广播/组播:
- 数据包同时发送给多个主机(如局域网中发现服务)。
- 轻量级请求/响应:
- DNS查询、简单的远程控制。
UDP socket C++代码示例
服务端接收数据示例(bind+recvfrom 阻塞式接收信息):
- 使用场景
- 简单服务端,适用于单个套接字的接收
#include <iostream>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <cstring>int main() {int sock_fd = socket(AF_INET, SOCK_DGRAM, 0); // 创建UDP套接字if (sock_fd < 0) {perror("Socket creation failed");return -1;}struct sockaddr_in server_addr;memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8080); // 监听端口server_addr.sin_addr.s_addr = INADDR_ANY; // 监听所有网络接口if (bind(sock_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {perror("Bind failed");close(sock_fd);return -1;}char buffer[1024];struct sockaddr_in client_addr;socklen_t addr_len = sizeof(client_addr);// 会阻塞等待 直到 接收信息int bytes_received = recvfrom(sock_fd, buffer, sizeof(buffer), 0, (struct sockaddr*)&client_addr, &addr_len); // 接收数据if (bytes_received > 0) {buffer[bytes_received] = '\0';std::cout << "Received message: " << buffer << std::endl;}close(sock_fd);return 0;
}
bind 绑定-监听 函数
-
功能:
- bind 函数用于将套接字绑定到特定的IP地址和端口号,通常用于服务端监听套接字。
- 服务器先运行监听特定的IP地址和端口号;然后客户端再
- bind 函数用于将套接字绑定到特定的IP地址和端口号,通常用于服务端监听套接字。
-
函数声明:
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数说明:
- sockfd:
- 套接字描述符,由 socket 函数返回。
- addr:
- 指向 sockaddr 结构体,表示要绑定的地址和端口。
- 通常使用 sockaddr_in,需强制转换为 sockaddr。
- 指向 sockaddr 结构体,表示要绑定的地址和端口。
- addrlen:
- addr 的长度(使用 sizeof(sockaddr_in))。
返回值:
成功:返回 0。
失败:返回 -1,并设置 errno。
示例:
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080); // 绑定端口号
server_addr.sin_addr.s_addr = INADDR_ANY; // 绑定到所有可用IP地址if (bind(sock_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {perror("Bind failed");close(sock_fd);
}
为什么一般都是监听所有网络接口呢?
server_addr.sin_addr.s_addr = INADDR_ANY; // 绑定到所有可用IP地址
这行代码中的 INADDR_ANY 是一个常用的常量,它代表了一个特殊的 IP 地址,即 0.0.0.0。当你将它设置为服务器套接字的地址时,表示该服务器将 监听所有网络接口。
-
理解什么是网络接口?
- 网络接口指计算机或设备上 每一个可以用于发送或接收数据的网络连接通道。
- 可以先理解为网卡,但是网络接口还包括一些虚拟网卡、本地回环接口(127.0.0.1)、甚至 VPN接口等,总的就是软硬 网络通道。
- 网络接口指计算机或设备上 每一个可以用于发送或接收数据的网络连接通道。
-
服务器为什么一般监听所有网络接口?
- 因为理论上我们希望只要是服务器这个端口号接收的,不管是哪一个网络接口,都交给服务器应用程序处理;
- 除非我们就只想让服务器处理从某个网络接口 接收的数据,才设置某一个网络接口的ip地址。例如:
- 只想让服务器接受本地(同一台机器上的应用程序)发出的数据
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
- 只想让服务器接受本地(同一台机器上的应用程序)发出的数据
为什么需要用inet_addr进行转换?
因为实际是采用网络字节序进行传输的,而用字符串形式十进制格式(如 “192.168.1.1”)只是为了人类方便阅读,所以需要转为网络字节序。
-
inet_addr作用
- 用于将一个点分十进制表示的 IPv4 地址(例如 “192.168.1.1”)转换为网络字节序的二进制格式。
-
inet_addr 将一个 IPv4 地址的点分十进制字符串(如 “192.168.1.1”)转换为网络字节序的 32 位整数。例如:
- “192.168.1.1” 在十进制中是:192 * 256^3 + 168 * 256^2 + 1 * 256^1 + 1 * 256^0
- 对应的二进制表示是:11000000 10101000 00000001 00000001
-
值得注意的是,inet_addr 已经不推荐使用,特别是在现代网络编程中,因为它对无效地址的处理可能不够清晰(比如返回 -1 会被误认为是有效的地址)。推荐使用 inet_pton 函数来替代,它更加健壮和安全。inet_pton 允许支持不同的地址族(IPv4 和 IPv6),并且不会出现类似 inet_addr 那样的错误返回值。
socket函数
-
作用
- 用于创建套接字socket,套接字是网络通信的基础,用于在客户端和服务端之间建立通信。
- 确定协议族(IPv4还是)、TCP还是UDP
-
函数声明
int socket(int domain, int type, int protocol);
参数说明:
- domain:指定通信的协议族(地址类型)。
- AF_INET:IPv4。
- AF_INET6:IPv6。
- AF_UNIX:本地通信(不使用网络)。
- type:指定套接字的类型。
- SOCK_STREAM:TCP(面向连接,保证数据可靠性)。
- SOCK_DGRAM:UDP(无连接,适合快速传输)。
- protocol:通常指定为 0,表示使用默认协议。
- 如果 type 是 SOCK_DGRAM,默认使用 UDP 协议。
- 如果 type 是 SOCK_STREAM,默认使用 TCP 协议。
返回值:
成功:返回套接字描述符(非负整数)。
失败:返回 -1,并设置 errno。
示例:
int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
if (sock_fd < 0) {perror("Socket creation failed");
}
sockaddr_in结构体
-
功能
- 用于表示 IPv4 地址和端口信息,通常在网络通信中用于绑定或指定目标地址。
-
定义:
struct sockaddr_in {short sin_family; // 地址族(必须为 AF_INET)unsigned short sin_port; // 端口号(网络字节序,需要使用 htons() 转换)struct in_addr sin_addr; // IPv4 地址char sin_zero[8]; // 填充字节,保持与 struct sockaddr 的大小一致(不使用,置 0)
};
字段说明:
- sin_family:
- 必须设置为 AF_INET(IPv4协议)。
- sin_port:
- 16位端口号,必须用 htons() 将主机字节序转换为网络字节序。
- sin_addr:
- 一个 struct in_addr 结构体,表示IPv4地址。
- 可以用 inet_addr() 或 inet_aton() 转换字符串形式的IP地址。
- 也可以设置为 INADDR_ANY,表示绑定到本地所有可用IP。
- 一个 struct in_addr 结构体,表示IPv4地址。
- sin_zero:
- 填充字段,不使用,应设置为 0。
示例:
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET; // IPv4
server_addr.sin_port = htons(8080); // 端口号(转换为网络字节序)
server_addr.sin_addr.s_addr = inet_addr("192.168.1.1"); // 目标IP地址
memset(server_addr.sin_zero, 0, sizeof(server_addr.sin_zero)); // 填充为0
recvfrom 函数
- 作用:一个用于从套接字接收数据的函数。
- 函数声明:
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
- sockfd:要读取数据的套接字文件描述符。
- buf:指向接收数据的缓冲区。
- len:缓冲区的大小。如果接收的数据超过该大小,数据会被截断。
- flags:设置标志,通常为 0。
控制接收行为的标志。常用的标志包括:- MSG_PEEK:查看数据但不从队列中移除数据。
- MSG_WAITALL:接收指定大小的完整数据,直到所有数据都接收到才返回。
- MSG_DONTWAIT:非阻塞操作,如果没有数据可接收则立即返回。
- MSG_TRUNC:如果接收的消息太大,超过缓冲区的大小,将丢弃多余部分并返回 EMSGSIZE 错误。
- src_addr:接收数据源的地址,通常可以为 NULL,如果不需要知道源地址。
- 创建一个指针,用来接收数据源的地址
- addrlen:地址长度,如果 src_addr 不是NULL,它将被修改为实际的地址长度。
函数返回值:
- 成功时:返回接收到的字节数。如果没有数据到达,且没有设置非阻塞标志,则会阻塞直到有数据可读;如果设置了 MSG_DONTWAIT 或套接字为非阻塞模式,它将立即返回 0 表示没有数据。
- 失败时:返回 -1,并设置 errno 以指示错误。常见错误包括:
- EAGAIN 或 EWOULDBLOCK:非阻塞模式下没有数据可接收。
- EBADF:sockfd 不是有效的套接字。
- ECONNREFUSED:目标主机拒绝连接(仅在某些类型的套接字中出现)。
- EINVAL:无效的地址长度或参数。
客户端发送数据示例:
#include <iostream>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <cstring>int main() {int sock_fd = socket(AF_INET, SOCK_DGRAM, 0); // 创建UDP套接字if (sock_fd < 0) {perror("Socket creation failed");return -1;}struct sockaddr_in server_addr;memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8080); // 目标端口号server_addr.sin_addr.s_addr = inet_addr("192.168.1.1"); // 目标IP地址const char* message = "Hello, UDP!";sendto(sock_fd, message, strlen(message), 0, (struct sockaddr*)&server_addr, sizeof(server_addr)); // 发送数据close(sock_fd);return 0;
}
sendto 发送 函数
-
功能:
- 用于通过UDP套接字发送数据报到指定地址和端口
-
函数声明
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
参数说明:
- sockfd:
- 套接字描述符,由 socket 函数返回。
- buf:
- 指向要发送的数据的缓冲区。
- len:
- 要发送的数据长度(字节数)。
- flags:
- 传输标志,通常设置为 0。
- dest_addr:
- 指向一个 sockaddr 结构体,表示目标地址。
- 通常传入 sockaddr_in,需要通过强制类型转换为 sockaddr。
- 指向一个 sockaddr 结构体,表示目标地址。
- addrlen:
- dest_addr 的长度(使用 sizeof(sockaddr_in))。
返回值:
成功:返回实际发送的字节数。
失败:返回 -1,并设置 errno。
- dest_addr 的长度(使用 sizeof(sockaddr_in))。
示例:
const char *message = "Hello, UDP!";
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = inet_addr("192.168.1.1");sendto(sock_fd, message, strlen(message), 0, (struct sockaddr*)&server_addr, sizeof(server_addr));
相关文章:
网络编程UDP—socket实现(C++)
网络编程UDP—socket实现 前言UDP客户端和服务端UDP使用场景UDP socket C代码示例服务端接收数据示例(bindrecvfrom 阻塞式接收信息):bind 绑定-监听 函数为什么一般都是监听所有网络接口呢?为什么需要用inet_addr进行转换&#x…...
个人用途虚拟机VM 17安装Ubuntu 16.04.5 图解
1.安装环境软件准备工作 1)下载 免费版VMware Pro 17 https://softwareupdate.vmware.com/cds/vmw-desktop/ws/17.6.1/24319023/windows/core/VMware-workstation-17.6.1-24319023.exe.tar 2)Ubuntu 16.04.5 LTS 64位 64-bit PC (AMD64) desktop imag…...
音视频入门基础:MPEG2-TS专题(23)——通过FFprobe显示TS流每个packet的信息
音视频入门基础:MPEG2-TS专题系列文章: 音视频入门基础:MPEG2-TS专题(1)——MPEG2-TS官方文档下载 音视频入门基础:MPEG2-TS专题(2)——使用FFmpeg命令生成ts文件 音视频入门基础…...
安卓project级别build.gradle和主module的build.gradle
以穿山甲为例讲解 如下图 gradle和gradle插件对应关系 Android Gradle 插件 8.7 版本说明 | Android Studio | Android Developers gradle对应在项目里的配置为 gradle插件对应的位置为...
【Qt】多元素控件:QListWidget、QTableWidget、QTreeWidget
目录 QListWidget 核心属性: 核心方法: 核心信号: 例子: QListWidgetItem QTableWidget 核心方法: 核心信号 QTableWidgetItem 例子: QTreeWidget 核心方法: 核心信号:…...
服务器nfs文件共享
1. 配置 NFS 服务器(NFS Server) 在 Ubuntu/Debian 上: sudo apt update sudo apt install nfs-kernel-server在 CentOS/RHEL 上: sudo yum install nfs-utils1.2 创建共享目录 选择一个要共享的目录,并确保该目录的权限正确设置。例如,假设我们要共享 /srv/nfs 目录…...
【hackmyvm】soul靶机wp
tags: HMVrbash绕过图片隐写PHP配置解析 1. 基本信息^toc 文章目录 1. 基本信息^toc2. 信息收集3. 图片解密3.1. 爆破用户名3.2. 绕过rbash3.3. 提权检测 4. 获取webshell4.1. 修改php配置 5. www-data提权gabriel6. gabriel提取到Peter7. Peter提权root 靶机链接 https://ha…...
安装winserver2008R2虚拟机步骤
一、服务器系统介绍 1.1什么是服务器? 服务器英文名称为“Server”,指的是网络环境下为客户机(Client)提供某种服务的专用计算机,服务器安装有网络操作系统(如Windows 2000 Server、Linux、Unix等)和各种服务器应用系统软件(如Web服务、电子…...
跟着 8.6k Star 的开源数据库,搞 RAG!
过去 9 年里,HelloGitHub 月刊累计收录了 3000 多个开源项目。然而,随着项目数量的增加,不少用户反馈:“搜索功能不好用,找不到想要的项目!” 这让我意识到,仅仅收录项目是不够的,还…...
RCE漏洞
一、课程知识点 1、远程代码执行漏洞原理与利用 2、常见的代码执行函数 3、常见的命令执行函数 4、常见的绕过姿势 5、命令执行漏洞防范 二、技术目标 1、掌握命令执行漏洞的原理 2、掌握 PHP 命令执行和代码执行的相关函数 3、掌握常见的绕过姿势 4、掌握代码执行漏洞防御措施…...
数据通信系统的主要性能指标
1.码元速率 n 误码率 2.数据传输速率 n 误比特率 3.时延 n 往返时间 RTT 1. 码元速率 n 码元 ( Code element) n 码元是 数字信号的计量单位 ( Signal element ), 又称为符号( Symbol )。 n 码元 是指在使用时域表示…...
C语言中的贪心算法
贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前最优解的算法,希望通过局部最优解的选择,最终得到全局最优解。它常用于解决最优化问题,如最小生成树、最短路径等。本文将从理论到实践,逐步引导…...
使用envoyfilter添加请求头
该envoyfilter实现了这样一个功能,如果请求头中含有Sw8,则添加请求头HasSw8: true。 1. 内嵌lua脚本 apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata:name: add-header-filternamespace: demo-bookinfo # 可根据实际情况调整命…...
【机器学习】回归
文章目录 1. 如何训练回归问题2. 泛化能力3. 误差来源4. 正则化5. 交叉验证 1. 如何训练回归问题 第一步:定义模型 线性模型: y ^ b ∑ j w j x j \hat{y} b \sum_{j} w_j x_j y^b∑jwjxj 其中,( w ) 是权重,( b )…...
Elasticsearch名词解释
文章目录 1.什么是Elasticsearch?2.什么是elastic stack(ELK)?3.什么是Lucene?4.什么是文档(document)?5.什么是词条(term)?6.什么是正向索引?7.什么是倒排索引?8.ES中的索引(index)9.映射(Mapping)10.DSL11.elastcisearch与my…...
把Huggingface下载的arrow数据集转化为json格式
Arrow2json 使用默认的Huggingface路径 以allenai/tulu-3-sft-mixture数据集为例。 使用load_dataset即可: from datasets import load_dataset# 加载数据集 dataset load_dataset("allenai/tulu-3-sft-mixture")# 指定保存路径 output_dir "~/…...
手机联系人 查询 添加操作
Android——添加联系人_android 添加联系人-CSDN博客 上面连接添加联系人已测试 是可以 Android : 获取、添加、手机联系人-ContentResolver简单应用_contentresolver 添加联系人-CSDN博客...
kkFileView集成springboot:使用自定义预览接口(非minio预览接口),发现无法预览资源
目录 1、背景2、原因分析3、解决办法 1、背景 按照项目验收要求,需要对minio中存储的数据进行加密 之前提供给kkFileView的预览地址都是获取的minio预览地址 由于minio中的资源进行了加密处理,所以我们自定义预览接口(进行解密操作ÿ…...
C++ 设计模式:观察者模式(Observer Pattern)
链接:C 设计模式 链接:C 设计模式 - 模板方法 链接:C 设计模式 - 策略模式 观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主…...
Mono 和 IL2Cpp的区别
Mono特征: 标准项目中有Assembly-CSharp.dll , 但在更复杂的项目或特定配置中,可能会有其他.dll或结构变更 在游戏的数据目录下看到一系列的.dll文件,这些文件的语言一般为中间语言 CE附加 , 查看是否有Mono.dll相关模块 目录有MonoBleedingEdge文件夹 IL2Cpp 标准项目应该…...
Windows平台ROBOT安装
Windows环境下ROBOT的安装,按照下文进行部署ROBOT的前提是你的python已安装并且环境变量已设置好. 一、安装setuptools 1、下载后安装 https://pypi.python.org/pypi/setuptools/ 下载你需要的包 setuptools-75.6.0.tar.gz 解压下载的包在命令行中进入该包,敲击如下命令后…...
DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(2)
DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(2) 背景 Tips 翻遍国内外的文档,关于 Argo 作为 CI/CD 当前所有开源的文档,博客,argo官方文档。得出的结论是: argo官方给出的例子都相对…...
深入浅出 MyBatis | CRUD 操作、配置解析
3、CRUD 3.1 namespace namespace 中的包名要和 Dao/Mapper 接口的包名一致! 比如将 UserDao 改名为 UserMapper 运行发现抱错,这是因为 UserMapper.xml 中没有同步更改 namespace 成功运行 给出 UserMapper 中的所有接口,接下来一一对…...
Hutool 发送 HTTP 请求的几种常见写法
最简单的 GET 请求: String result HttpUtil.get("https://www.baidu.com");带参数的 GET 请求: // 方法1: 直接拼接URL参数 String result HttpUtil.get("https://www.baidu.com?name张三&age18");// 方法2: 使用 HashMap…...
计算机网络|数据流向剖析与分层模型详解
文章目录 一、网络中的数据流向二、计算机网络通信模型1.OSI 模型2.TCP/IP 模型3.TCP/IP五层模型3.1 分层架构描述3.2各层地址结构3.3UDP数据包报头结构 三、总结 一、网络中的数据流向 在计算机网络中,数据的流向是指数据从发送端到接收端的传输路径。数据流向涉及…...
在Java技术栈中,常用的分布式一致性算法和框架
在Java技术栈中,常用的分布式一致性算法和框架包括: Raft算法: 常用框架: etcd:虽然主要用Go语言编写,但可以通过Java客户端进行访问和操作。Apache Kafka:在其控制器选举中使用类似Raft的机…...
2024.12.29(进程线程实现并发服务器)
作业 多进程多线程并发服务器实现一遍提交。 服务器 #include <myhead.h> #define PORT 12345 #define IP "192.168.124.123"void *fun(void *fd) {int newfd *(int *)fd;char buff[1024];while(1){int res recv(newfd,buff,sizeof(buff),0);if(res 0){p…...
Docker完整技术汇总
Docker 背景引入 在实际开发过程中有三个环境,分别是:开发环境、测试环境以及生产环境,假设开发环境中开发人员用的是jdk8,而在测试环境中测试人员用的时jdk7,这就导致程序员开发完系统后将其打成jar包发给测试人员后…...
区块链安全常见的攻击合约和简单复现,附带详细分析——不安全调用漏洞 (Unsafe Call Vulnerability)【6】
区块链安全常见的攻击分析——不安全调用漏洞 Unsafe Call Vulnerability 区块链安全常见的攻击合约和简单复现,附带详细分析——不安全调用漏洞 (Unsafe Call Vulnerability)【6】1.1 漏洞合约1.2 漏洞分析1.3 攻击步骤分析1.4 攻击合约 区块链安全常见的攻击合约和…...
Vue.js 高难度组件开发:从插件化到性能极限优化
Vue.js 高难度组件开发:从插件化到性能极限优化 引言一、插件化组件开发1. 什么是插件化组件2. 案例:构建一个插件化的图表组件 二、动态扩展与自定义组件行为1. 动态添加组件功能 三、复杂交互与细粒度状态管理1. 使用 Vuex 的模块化和动态模块注册 四、…...
一个通用的居于 OAuth2的API集成方案
在现代 web 应用程序中,OAuth 协议是授权和认证的主流选择。为了与多个授权提供商进行无缝对接,我们需要一个易于扩展和维护的 OAuth 解决方案。本文将介绍如何构建一个灵活的、支持多提供商的 OAuth 系统,包括动态 API 调用、路径参数替换、…...
折腾日记:如何让吃灰笔记本发挥余热——搭建一个相册服务
背景 之前写过,我在家里用了一台旧的工作站笔记本做了服务器,连上一个绿联的5位硬盘盒实现简单的网盘功能,然而,还是觉的不太理想,比如使用filebrowser虽然可以备份文件和图片,当使用手机使用网页…...
C# dynamic 类型详解
简介 C# 中的 dynamic 是一种特殊类型,它允许在运行时确定对象的类型和成员,而不是在编译时。 dynamic 的定义 dynamic 是一种类型,它告诉编译器对其进行“动态类型解析”。 dynamic 类型的变量会跳过编译时类型检查,所有的操作…...
postgresql ERROR: cannot drop the currently open database
postgresql ERROR: cannot drop the currently open database 解释: 这个错误表明你正在尝试删除或者切换当前正在使用的数据库。在PostgreSQL中,一个数据库对应着一个进程,当一个数据库处于打开状态时,你不能直接删除或者切换它…...
Excel基础知识
一:数组 一行或者一列数据称为一维数组,多行多列称为二维数组,数组支持算术运算(如加减乘除等)。 行:{1,2,3,4} 数组中的每个值用逗号分隔列:{1;2;3;4} 数组中的每个值用分号分隔行列…...
【pwnlab_init靶场渗透】
文章目录 一、基础信息 二、信息收集 三、漏洞利用 四、反弹shell 五、提权 一、基础信息 Kali IP :192.168.20.146 靶机IP:192.168.20.157 二、信息收集 nmap -sS -sV -p- -A 192.168.20.157 开放了80、111、3306、50749等端口 访问一下80端口…...
【泰克生物】酶突变文库筛选技术:通过酵母展示实现酶的精准进化
酶工程是生物技术中的一个重要领域,涵盖了酶的改造、优化和应用。通过对酶分子进行定向进化,可以获得具有更高催化效率、更广泛底物特异性或更强稳定性的酶。酶突变文库筛选技术,尤其是酵母展示平台,提供了一种高效且可操作的方法…...
C++Primer 类简介
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
人工智能知识分享第三天-机器学习中交叉验证和网格搜索
交叉验证和网格搜索 交叉验证解释: 概述: 它是一种更加完善的, 可信度更高的模型预估方式, 思路是: 把数据集分成n份, 每次都取1份当做测试集, 其它的当做训练集, 然后计算模型的: 评分. 然后再用下1份当做测试集, 其它当做训练集, 计算模型评分, 分成几份, 就进行几次计算, 最…...
00序言:我为什么会选择AI?
序言:我为什么会选择AI? 2023年,对我来说是一个转折点。那一年,我在人工智能领域已经积累了几年的经验,深刻感受到了这场技术变革的巨大冲击。曾经,我也像许多人一样,怀疑自己是否能跟上这个快…...
【AIGC-ChatGPT副业提示词指令 - 动图】魔法咖啡馆:一个融合创意与治愈的互动体验设计
引言 在当今快节奏的生活中,咖啡早已不仅仅是提神醒脑的饮品,更成为了一种情感寄托和生活态度的表达。本文将介绍一个独特的"魔法咖啡馆"互动体验设计,通过将咖啡与情感、魔法元素相结合,创造出一个充满想象力和治愈感…...
VSCode outline显示异常的解决方法——清除VSCode的配置和用户文件
1. 删除所有配置文件 sudo apt remove --purge code2. 删除所有用户文件 rm -rf ~/.config/Code rm -rf ~/.vscode rm -rf ~/.local/share/code rm -rf ~/.cache/Code3. 重装Code sudo dpkg -i code_1.96.2-1734607745_amd64.deb如此,可修复异常导致的outline无…...
Maple软件的安装和使用
文章目录 1.前言说明2.我为什么要学习Maple3.软件的安装4.如何使用4.1基本的赋值语句4.2函数的定义4.3三个类型的书写介质 5.指数运算5.1使用面板5.2自己输入 6.对数的使用 1.前言说明 众所周知,我虽然是一名这个计算机专业的学生,但是我对于数学&#…...
elasticsearch-java客户端jar包中各模块的应用梳理
最近使用elasticsearch-java客户端实现对elasticsearch服务的Api请求,现对elasticsearch-java客户端jar包中各模块的应用做个梳理。主要是对co.elastic.clients.elasticsearch路径下的各子包的简单说明。使用的版本为:co.elastic.clients:elasticsearch-…...
android13 系统文字大小和显示大小的修改
没啥可解释,如题所示,修改系统默认文字大小和显示大小 一修改系统文字大小: 系统文字太小,需要修改文字大小修改如下 commit 82675b7d8ac278e80d94e6b2b1417b266065d2ec Author: admin <bianjbflyscale.cn> Date: Sat …...
【华为OD-E卷 - 任务总执行时长 100分(python、java、c++、js、c)】
【华为OD-E卷 - 任务总执行时长 100分(python、java、c、js、c)】 题目 任务编排服务负责对任务进行组合调度。 参与编排的任务有两种类型,其中一种执行时长为taskA,另一种执行时长为taskB。 任务一旦开始执行不能被打断&#x…...
vue中子组件给父组件传值
在 Vue.js 中,子组件向父组件传递数据或事件通常是通过 $emit 方法来实现的。这个方法允许子组件触发一个自定义事件,父组件可以通过监听这些事件来接收信息。以下是实现这一过程的基本步骤: 1. 子组件触发事件 在子组件中,使用…...
【js】记录预览pdf文件
接口调用拿到pdf的文件流,用blob处理这个文件流拿到url,使用window.open跳转新的窗口进行预览 api({dataType: blob, }).then(res >{if(res.code 0){this.previewPDF(res,application/pdf;charsetutf-8,pdf文件名)} })previewPDF (res, type, fname…...
【Spring MVC 异常处理机制】应对意外情况
在 Web 应用中,异常是不可避免的。用户的输入不合法,服务的某部分出错,或者数据库连接失败,这些情况都可能触发异常。那么问题来了:如何优雅地捕获并处理这些异常,让用户体验不至于因为一时的错误而受损&am…...
《计算机组成及汇编语言原理》阅读笔记:p128-p132
《计算机组成及汇编语言原理》学习第 10 天,p128-p132 总结,总计 5 页。 一、技术总结 1.8088 organization and architecture 8088处理器是16位电脑,寄存器是16位,数据总线(data bus)是8位,地址总线是20位。 (1)g…...