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

网络编程UDP—socket实现(C++)

网络编程UDP—socket实现

  • 前言
  • UDP客户端和服务端
  • UDP使用场景
  • UDP socket C++代码示例
    • 服务端接收数据示例(bind+recvfrom 阻塞式接收信息):
      • bind 绑定-监听 函数
        • 为什么一般都是监听所有网络接口呢?
        • 为什么需要用inet_addr进行转换?
      • socket函数
      • sockaddr_in结构体
      • recvfrom 函数
    • 客户端发送数据示例:
      • sendto 发送 函数

前言

  • UDP通信需要哪些必要信息

    • IP地址
      • 用于定位通讯双方
    • 端口号
      • 用于标识通信的具体应用或服务。
      • 传输层通信都需要端口号的。
  • 网络要求

    • 双方必须是可以进行ip通信的
      • UDP依赖IP协议栈(IPv4或IPv6)完成路由、传输
    • 双方需要用同一协议

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地址和端口号;然后客户端再
  • 函数声明:

    int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
    

参数说明:

  1. sockfd:
    • 套接字描述符,由 socket 函数返回。
  2. addr:
    • 指向 sockaddr 结构体,表示要绑定的地址和端口。
      • 通常使用 sockaddr_in,需强制转换为 sockaddr。
  3. 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);
    

参数说明:

  1. domain:指定通信的协议族(地址类型)。
  • AF_INET:IPv4。
  • AF_INET6:IPv6。
  • AF_UNIX:本地通信(不使用网络)。
  1. type:指定套接字的类型。
  • SOCK_STREAM:TCP(面向连接,保证数据可靠性)。
  • SOCK_DGRAM:UDP(无连接,适合快速传输)。
  1. 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)
};

字段说明:

  1. sin_family:
    • 必须设置为 AF_INET(IPv4协议)。
  2. sin_port:
    • 16位端口号,必须用 htons() 将主机字节序转换为网络字节序。
  3. sin_addr:
    • 一个 struct in_addr 结构体,表示IPv4地址。
      • 可以用 inet_addr() 或 inet_aton() 转换字符串形式的IP地址。
      • 也可以设置为 INADDR_ANY,表示绑定到本地所有可用IP。
  4. 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);
  1. sockfd:要读取数据的套接字文件描述符。
  2. buf:指向接收数据的缓冲区。
  3. len:缓冲区的大小。如果接收的数据超过该大小,数据会被截断。
  4. flags:设置标志,通常为 0。
    控制接收行为的标志。常用的标志包括:
    • MSG_PEEK:查看数据但不从队列中移除数据。
    • MSG_WAITALL:接收指定大小的完整数据,直到所有数据都接收到才返回。
    • MSG_DONTWAIT:非阻塞操作,如果没有数据可接收则立即返回。
    • MSG_TRUNC:如果接收的消息太大,超过缓冲区的大小,将丢弃多余部分并返回 EMSGSIZE 错误。
  5. src_addr:接收数据源的地址,通常可以为 NULL,如果不需要知道源地址。
    • 创建一个指针,用来接收数据源的地址
  6. 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);

参数说明:

  1. sockfd:
    • 套接字描述符,由 socket 函数返回。
  2. buf:
    • 指向要发送的数据的缓冲区。
  3. len:
    • 要发送的数据长度(字节数)。
  4. flags:
    • 传输标志,通常设置为 0。
  5. dest_addr:
    • 指向一个 sockaddr 结构体,表示目标地址。
      • 通常传入 sockaddr_in,需要通过强制类型转换为 sockaddr。
  6. addrlen:
    • dest_addr 的长度(使用 sizeof(sockaddr_in))。
      返回值:
      成功:返回实际发送的字节数。
      失败:返回 -1,并设置 errno。

示例:

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代码示例服务端接收数据示例&#xff08;bindrecvfrom 阻塞式接收信息&#xff09;&#xff1a;bind 绑定-监听 函数为什么一般都是监听所有网络接口呢&#xff1f;为什么需要用inet_addr进行转换&#x…...

个人用途虚拟机VM 17安装Ubuntu 16.04.5 图解

1.安装环境软件准备工作 1&#xff09;下载 免费版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&#xff09;Ubuntu 16.04.5 LTS 64位 64-bit PC (AMD64) desktop imag…...

音视频入门基础:MPEG2-TS专题(23)——通过FFprobe显示TS流每个packet的信息

音视频入门基础&#xff1a;MPEG2-TS专题系列文章&#xff1a; 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;1&#xff09;——MPEG2-TS官方文档下载 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;2&#xff09;——使用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 核心属性&#xff1a; 核心方法&#xff1a; 核心信号&#xff1a; 例子&#xff1a; QListWidgetItem QTableWidget 核心方法&#xff1a; 核心信号 QTableWidgetItem 例子&#xff1a; QTreeWidget 核心方法&#xff1a; 核心信号&#xff1a…...

服务器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什么是服务器&#xff1f; 服务器英文名称为“Server”&#xff0c;指的是网络环境下为客户机(Client)提供某种服务的专用计算机&#xff0c;服务器安装有网络操作系统(如Windows 2000 Server、Linux、Unix等)和各种服务器应用系统软件(如Web服务、电子…...

跟着 8.6k Star 的开源数据库,搞 RAG!

过去 9 年里&#xff0c;HelloGitHub 月刊累计收录了 3000 多个开源项目。然而&#xff0c;随着项目数量的增加&#xff0c;不少用户反馈&#xff1a;“搜索功能不好用&#xff0c;找不到想要的项目&#xff01;” 这让我意识到&#xff0c;仅仅收录项目是不够的&#xff0c;还…...

RCE漏洞

一、课程知识点 1、远程代码执行漏洞原理与利用 2、常见的代码执行函数 3、常见的命令执行函数 4、常见的绕过姿势 5、命令执行漏洞防范 二、技术目标 1、掌握命令执行漏洞的原理 2、掌握 PHP 命令执行和代码执行的相关函数 3、掌握常见的绕过姿势 4、掌握代码执行漏洞防御措施…...

数据通信系统的主要性能指标

1.码元速率 n 误码率 2.数据传输速率 n 误比特率 3.时延 n 往返时间 RTT 1. 码元速率 n 码元 ( Code element) n 码元是 数字信号的计量单位 &#xff08; Signal element &#xff09;&#xff0c; 又称为符号&#xff08; Symbol &#xff09;。 n 码元 是指在使用时域表示…...

C语言中的贪心算法

贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取当前最优解的算法&#xff0c;希望通过局部最优解的选择&#xff0c;最终得到全局最优解。它常用于解决最优化问题&#xff0c;如最小生成树、最短路径等。本文将从理论到实践&#xff0c;逐步引导…...

使用envoyfilter添加请求头

该envoyfilter实现了这样一个功能&#xff0c;如果请求头中含有Sw8&#xff0c;则添加请求头HasSw8: true。 1. 内嵌lua脚本 apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata:name: add-header-filternamespace: demo-bookinfo # 可根据实际情况调整命…...

【机器学习】回归

文章目录 1. 如何训练回归问题2. 泛化能力3. 误差来源4. 正则化5. 交叉验证 1. 如何训练回归问题 第一步&#xff1a;定义模型 线性模型&#xff1a; y ^ b ∑ j w j x j \hat{y} b \sum_{j} w_j x_j y^​b∑j​wj​xj​ 其中&#xff0c;( w ) 是权重&#xff0c;( b )…...

Elasticsearch名词解释

文章目录 1.什么是Elasticsearch?2.什么是elastic stack(ELK)?3.什么是Lucene?4.什么是文档(document)&#xff1f;5.什么是词条(term)&#xff1f;6.什么是正向索引&#xff1f;7.什么是倒排索引&#xff1f;8.ES中的索引(index)9.映射(Mapping)10.DSL11.elastcisearch与my…...

把Huggingface下载的arrow数据集转化为json格式

Arrow2json 使用默认的Huggingface路径 以allenai/tulu-3-sft-mixture数据集为例。 使用load_dataset即可&#xff1a; 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、背景 按照项目验收要求&#xff0c;需要对minio中存储的数据进行加密 之前提供给kkFileView的预览地址都是获取的minio预览地址 由于minio中的资源进行了加密处理&#xff0c;所以我们自定义预览接口&#xff08;进行解密操作&#xff…...

C++ 设计模式:观察者模式(Observer Pattern)

链接&#xff1a;C 设计模式 链接&#xff1a;C 设计模式 - 模板方法 链接&#xff1a;C 设计模式 - 策略模式 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主…...

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实战&#xff1a;用Kubernetes和Argo打造自动化CI/CD流程&#xff08;2&#xff09; 背景 Tips 翻遍国内外的文档&#xff0c;关于 Argo 作为 CI/CD 当前所有开源的文档&#xff0c;博客&#xff0c;argo官方文档。得出的结论是&#xff1a; argo官方给出的例子都相对…...

深入浅出 MyBatis | CRUD 操作、配置解析

3、CRUD 3.1 namespace namespace 中的包名要和 Dao/Mapper 接口的包名一致&#xff01; 比如将 UserDao 改名为 UserMapper 运行发现抱错&#xff0c;这是因为 UserMapper.xml 中没有同步更改 namespace 成功运行 给出 UserMapper 中的所有接口&#xff0c;接下来一一对…...

Hutool 发送 HTTP 请求的几种常见写法

最简单的 GET 请求&#xff1a; String result HttpUtil.get("https://www.baidu.com");带参数的 GET 请求&#xff1a; // 方法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数据包报头结构 三、总结 一、网络中的数据流向 在计算机网络中&#xff0c;数据的流向是指数据从发送端到接收端的传输路径。数据流向涉及…...

在Java技术栈中,常用的分布式一致性算法和框架

在Java技术栈中&#xff0c;常用的分布式一致性算法和框架包括&#xff1a; Raft算法&#xff1a; 常用框架&#xff1a; etcd&#xff1a;虽然主要用Go语言编写&#xff0c;但可以通过Java客户端进行访问和操作。Apache Kafka&#xff1a;在其控制器选举中使用类似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 背景引入 在实际开发过程中有三个环境&#xff0c;分别是&#xff1a;开发环境、测试环境以及生产环境&#xff0c;假设开发环境中开发人员用的是jdk8&#xff0c;而在测试环境中测试人员用的时jdk7&#xff0c;这就导致程序员开发完系统后将其打成jar包发给测试人员后…...

区块链安全常见的攻击合约和简单复现,附带详细分析——不安全调用漏洞 (Unsafe Call Vulnerability)【6】

区块链安全常见的攻击分析——不安全调用漏洞 Unsafe Call Vulnerability 区块链安全常见的攻击合约和简单复现&#xff0c;附带详细分析——不安全调用漏洞 (Unsafe Call Vulnerability)【6】1.1 漏洞合约1.2 漏洞分析1.3 攻击步骤分析1.4 攻击合约 区块链安全常见的攻击合约和…...

Vue.js 高难度组件开发:从插件化到性能极限优化

Vue.js 高难度组件开发&#xff1a;从插件化到性能极限优化 引言一、插件化组件开发1. 什么是插件化组件2. 案例&#xff1a;构建一个插件化的图表组件 二、动态扩展与自定义组件行为1. 动态添加组件功能 三、复杂交互与细粒度状态管理1. 使用 Vuex 的模块化和动态模块注册 四、…...

一个通用的居于 OAuth2的API集成方案

在现代 web 应用程序中&#xff0c;OAuth 协议是授权和认证的主流选择。为了与多个授权提供商进行无缝对接&#xff0c;我们需要一个易于扩展和维护的 OAuth 解决方案。本文将介绍如何构建一个灵活的、支持多提供商的 OAuth 系统&#xff0c;包括动态 API 调用、路径参数替换、…...

折腾日记:如何让吃灰笔记本发挥余热——搭建一个相册服务

背景 之前写过&#xff0c;我在家里用了一台旧的工作站笔记本做了服务器&#xff0c;连上一个绿联的5位硬盘盒实现简单的网盘功能&#xff0c;然而&#xff0c;还是觉的不太理想&#xff0c;比如使用filebrowser虽然可以备份文件和图片&#xff0c;当使用手机使用网页&#xf…...

C# dynamic 类型详解

简介 C# 中的 dynamic 是一种特殊类型&#xff0c;它允许在运行时确定对象的类型和成员&#xff0c;而不是在编译时。 dynamic 的定义 dynamic 是一种类型&#xff0c;它告诉编译器对其进行“动态类型解析”。 dynamic 类型的变量会跳过编译时类型检查&#xff0c;所有的操作…...

postgresql ERROR: cannot drop the currently open database

postgresql ERROR: cannot drop the currently open database 解释&#xff1a; 这个错误表明你正在尝试删除或者切换当前正在使用的数据库。在PostgreSQL中&#xff0c;一个数据库对应着一个进程&#xff0c;当一个数据库处于打开状态时&#xff0c;你不能直接删除或者切换它…...

Excel基础知识

一&#xff1a;数组 一行或者一列数据称为一维数组&#xff0c;多行多列称为二维数组&#xff0c;数组支持算术运算&#xff08;如加减乘除等&#xff09;。 行&#xff1a;{1,2,3,4} 数组中的每个值用逗号分隔列&#xff1a;{1;2;3;4} 数组中的每个值用分号分隔行列&#xf…...

【pwnlab_init靶场渗透】

文章目录 一、基础信息 二、信息收集 三、漏洞利用 四、反弹shell 五、提权 一、基础信息 Kali IP &#xff1a;192.168.20.146 靶机IP&#xff1a;192.168.20.157 二、信息收集 nmap -sS -sV -p- -A 192.168.20.157 开放了80、111、3306、50749等端口 访问一下80端口…...

【泰克生物】酶突变文库筛选技术:通过酵母展示实现酶的精准进化

酶工程是生物技术中的一个重要领域&#xff0c;涵盖了酶的改造、优化和应用。通过对酶分子进行定向进化&#xff0c;可以获得具有更高催化效率、更广泛底物特异性或更强稳定性的酶。酶突变文库筛选技术&#xff0c;尤其是酵母展示平台&#xff0c;提供了一种高效且可操作的方法…...

C++Primer 类简介

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

人工智能知识分享第三天-机器学习中交叉验证和网格搜索

交叉验证和网格搜索 交叉验证解释: 概述: 它是一种更加完善的, 可信度更高的模型预估方式, 思路是: 把数据集分成n份, 每次都取1份当做测试集, 其它的当做训练集, 然后计算模型的: 评分. 然后再用下1份当做测试集, 其它当做训练集, 计算模型评分, 分成几份, 就进行几次计算, 最…...

00序言:我为什么会选择AI?

序言&#xff1a;我为什么会选择AI&#xff1f; 2023年&#xff0c;对我来说是一个转折点。那一年&#xff0c;我在人工智能领域已经积累了几年的经验&#xff0c;深刻感受到了这场技术变革的巨大冲击。曾经&#xff0c;我也像许多人一样&#xff0c;怀疑自己是否能跟上这个快…...

【AIGC-ChatGPT副业提示词指令 - 动图】魔法咖啡馆:一个融合创意与治愈的互动体验设计

引言 在当今快节奏的生活中&#xff0c;咖啡早已不仅仅是提神醒脑的饮品&#xff0c;更成为了一种情感寄托和生活态度的表达。本文将介绍一个独特的"魔法咖啡馆"互动体验设计&#xff0c;通过将咖啡与情感、魔法元素相结合&#xff0c;创造出一个充满想象力和治愈感…...

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如此&#xff0c;可修复异常导致的outline无…...

Maple软件的安装和使用

文章目录 1.前言说明2.我为什么要学习Maple3.软件的安装4.如何使用4.1基本的赋值语句4.2函数的定义4.3三个类型的书写介质 5.指数运算5.1使用面板5.2自己输入 6.对数的使用 1.前言说明 众所周知&#xff0c;我虽然是一名这个计算机专业的学生&#xff0c;但是我对于数学&#…...

elasticsearch-java客户端jar包中各模块的应用梳理

最近使用elasticsearch-java客户端实现对elasticsearch服务的Api请求&#xff0c;现对elasticsearch-java客户端jar包中各模块的应用做个梳理。主要是对co.elastic.clients.elasticsearch路径下的各子包的简单说明。使用的版本为&#xff1a;co.elastic.clients:elasticsearch-…...

android13 系统文字大小和显示大小的修改

没啥可解释&#xff0c;如题所示&#xff0c;修改系统默认文字大小和显示大小 一修改系统文字大小&#xff1a; 系统文字太小&#xff0c;需要修改文字大小修改如下 commit 82675b7d8ac278e80d94e6b2b1417b266065d2ec Author: admin <bianjbflyscale.cn> Date: Sat …...

【华为OD-E卷 - 任务总执行时长 100分(python、java、c++、js、c)】

【华为OD-E卷 - 任务总执行时长 100分&#xff08;python、java、c、js、c&#xff09;】 题目 任务编排服务负责对任务进行组合调度。 参与编排的任务有两种类型&#xff0c;其中一种执行时长为taskA&#xff0c;另一种执行时长为taskB。 任务一旦开始执行不能被打断&#x…...

vue中子组件给父组件传值

在 Vue.js 中&#xff0c;子组件向父组件传递数据或事件通常是通过 $emit 方法来实现的。这个方法允许子组件触发一个自定义事件&#xff0c;父组件可以通过监听这些事件来接收信息。以下是实现这一过程的基本步骤&#xff1a; 1. 子组件触发事件 在子组件中&#xff0c;使用…...

【js】记录预览pdf文件

接口调用拿到pdf的文件流&#xff0c;用blob处理这个文件流拿到url&#xff0c;使用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 应用中&#xff0c;异常是不可避免的。用户的输入不合法&#xff0c;服务的某部分出错&#xff0c;或者数据库连接失败&#xff0c;这些情况都可能触发异常。那么问题来了&#xff1a;如何优雅地捕获并处理这些异常&#xff0c;让用户体验不至于因为一时的错误而受损&am…...

《计算机组成及汇编语言原理》阅读笔记:p128-p132

《计算机组成及汇编语言原理》学习第 10 天&#xff0c;p128-p132 总结&#xff0c;总计 5 页。 一、技术总结 1.8088 organization and architecture 8088处理器是16位电脑&#xff0c;寄存器是16位&#xff0c;数据总线(data bus)是8位&#xff0c;地址总线是20位。 (1)g…...