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

Tcp——客户端服务器

Tcp——客户端服务器

目录

一、基本概念

二、代码

2.1 ser服务器

2.2 cil客户端


一、基本概念

TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在TCP/IP模型中,TCP位于IP层之上,应用层之下,负责在网络中的两个主机之间建立连接,进行数据传输,并确保数据的完整性和顺序性。

TCP客户端和服务器通过建立连接、进行数据交换和关闭连接的过程进行通信。TCP协议确保了数据的可靠传输,包括数据完整性、顺序性、流量控制和拥塞控制。通过使用套接字编程,可以实现TCP客户端和服务器之间的通信。

这张图展示了一个典型的网络通信过程中,服务端和客户端的常用套接字(socket)操作步骤。套接字是网络编程中用于不同主机间通信的端点。

### 服务端

1. **socket()**:创建一个新的套接字。
2. **bind(ip+port)**:将套接字绑定到指定的IP地址和端口号上,以便监听来自该地址和端口的连接请求。
3. **listen()**:使套接字进入监听状态,等待客户端的连接请求。
4. **accept()**:接受客户端的连接请求,建立连接
5. **recv()**:接收来自客户端的数据。
6. **send()**:向客户端发送数据。
7. **close()**:关闭套接字,结束通信。

### 客户端

1. **socket()**:创建一个新的套接字。
2. **connect(ip+port)**:向服务端的指定IP地址和端口号发起连接请求
3. **send()**:向服务端发送数据。
4. **recv()**:接收来自服务端的数据。
5. **close()**:关闭套接字,结束通信。

在实际的网络通信中,服务端和客户端通过这些步骤进行数据的发送和接收,实现网络通信。服务端通常先启动,等待客户端的连接请求,而客户端则主动发起连接请求,连接成功后进行数据交换。

二、代码

2.1 ser服务器

TCP服务器程序,用于接受客户端的连接请求,并与客户端进行数据交换 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>int main()
{int sockfd = socket(AF_INET,SOCK_STREAM,0);//创建套接子,失败 -1if( -1 == sockfd ){exit(1);}struct sockaddr_in saddr,caddr;//套接字的地址(也就是ip+port)memset(&saddr,0,sizeof(saddr));saddr.sin_family = AF_INET;//ipv4地址族saddr.sin_port = htons(6000);//网络字节序列(大端)saddr.sin_addr.s_addr = inet_addr("127.0.0.1");//点分十进制字符串表示的ip 转换为无符号整形表示的ip地址int res = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));if( -1 == res){printf("bind err\n");exit(1);}res = listen(sockfd,5);//创建监听队列,客户端连接服务器时,要存放客户端的连接信息。 5是监听队列的大小if( -1 == res ){exit(1);}while( 1 ){int len = sizeof(caddr);int c = accept(sockfd,(struct sockaddr*)&caddr,&len);//接受客户端连接,caddr,用来存放客户端的ip+portif( c < 0 ){continue;}printf("accept c=%d\n",c);char buff[128] = {0};int n = recv(c,buff,127,0);//接受客户端发送的数据printf("n=%d,recv:%s\n",n,buff);send(c,"ok",2,0);//向客户端发送数据close(c);}}

1. 包含头文件
- `sys/socket.h` 和 `netinet/in.h` 是网络编程中常用的头文件,包含了套接字相关的函数和结构体定义。
- `arpa/inet.h` 包含了处理网络地址的函数,如 `inet_addr()` 和 `htons()`。

 2. 创建套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == sockfd) {
    exit(1);
}

- `socket()` 函数用于创建一个新的套接字。
- 参数 `AF_INET` 指定了地址族为IPv4,`SOCK_STREAM` 指定了套接字类型为面向连接的流套接字(TCP)。
- 如果创建失败,返回 `-1`,程序将退出。

3. 设置服务器地址

定义地址结构体

struct sockaddr_in saddr, caddr;

  • struct sockaddr_in 是一个结构体,用于存储IPv4地址和端口号。

  • saddr 用于存储服务器的地址信息 包含了ip地址和端口号。

  • caddr 用于存储客户端的地址信息。

初始化saddr结构体

memset(&saddr, 0, sizeof(saddr));

  • memset() 函数用于将 saddr 结构体的所有字节初始化为0。

  • 这样做可以确保结构体中的所有字段都被清零,避免使用未初始化的值。

设置地址族

saddr.sin_family = AF_INET;

  • sin_family 字段用于指定地址族,AF_INET 表示IPv4地址族。

设置端口号

saddr.sin_port = htons(6000);

  • sin_port 字段用于指定端口号。

  • htons(6000) 函数用于将主机字节序的端口号转换为网络字节序(大端序)。这是必要的,因为网络协议要求端口号使用网络字节序。

  • 6000 是服务器监听的端口号。

设置ip地址
saddr.sin_addr.s_addr = inet_addr("127.0.0.1");

  • sin_addr 字段用于指定IP地址。

  • inet_addr("127.0.0.1") 函数用于将点分十进制的IP地址转换为网络字节序的二进制格式。

  • "127.0.0.1" 是本地回环地址,表示服务器将监听本地回环接口。

 4. 绑定套接字
int res = bind(sockfd, (struct sockaddr*)&saddr, sizeof(saddr));
if (res == -1) {
    printf("bind err\n");
    exit(1);
}

这段代码的目的是确保服务器的套接字能够被正确地绑定到指定的IP地址和端口号上,这是服务器能够监听并接受客户端连接请求的前提。

  • bind() 函数是用于将一个套接字绑定到一个特定的网络地址和端口上的函数。

  • 第一个参数 sockfd 是之前通过 socket() 函数创建的套接字的文件描述符。这个文件描述符是一个整数,用于标识这个套接字。

  • 第二个参数 (struct sockaddr*)&saddr 是一个指向 sockaddr 结构体的指针,该结构体包含了要绑定的地址信息。这里 saddr 是一个 sockaddr_in 类型的结构体,专门用于IPv4地址。通过将 saddr 的地址转换为 struct sockaddr* 类型,可以将其传递给 bind() 函数。

  • 第三个参数 sizeof(saddr)saddr 结构体的大小。这个大小告诉 bind() 函数需要多少字节来存储地址信息。sizeof(saddr) 确保了无论 saddr 结构体中包含多少字段,bind() 函数都能正确地处理它。

 5. 监听连接请求
res = listen(sockfd, 5);
if (-1 == res) {
    exit(1);
}

  • listen() 函数是用于启动套接字的监听过程的。这个函数告诉操作系统,服务器准备好接受连接请求了。

  • sockfd 是之前创建的套接字的文件描述符,它是服务器用来监听连接请求的“通道”。

  • 5 是一个参数,指定了服务器应该维护的最大挂起连接数。挂起连接是指那些已经到达但还没有被服务器接受的连接请求。如果设置为5,就意味着服务器可以同时处理5个等待接受的连接请求。如果超过5个,新的连接请求可能会被拒绝。

6. 接受客户端连接
while (1) {
    int len = sizeof(caddr);
    int c = accept(sockfd, (struct sockaddr*)&caddr, &len);
    if (c < 0) {
        continue;
    }

    printf("accept c=%d\n", c);
}

  • sizeof(caddr) 计算 caddr 结构体占用的字节数,这样程序就知道在 accept() 函数中需要多少空间来存储客户端的地址信息。

  • accept() 函数用于接受客户端的连接请求。

  • 第一个参数 sockfd 是服务器监听的套接字文件描述符。

  • 第二个参数是指向 caddr 结构体的指针,caddr 用来存储连接请求中包含的客户端地址信息。

  • 第三个参数 &len 是一个指向 len 变量的指针,len 表示 caddr 结构体的大小,accept() 函数会更新这个值,以反映实际接收到的地址信息的大小。

7. 数据交换
char buff[128] = {0};
int n = recv(c, buff, 127, 0);
printf("n=%d,recv:%s\n", n, buff);

send(c, "ok", 2, 0);
close(c);

- 定义一个缓冲区 `buff`,用于存储从客户端接收的数据。
- `recv()` 函数用于从客户端接收数据,并将接收到的数据存储在 `buff` 中。
- 打印接收到的数据的长度和内容。
- `send()` 函数用于向客户端发送数据,这里发送字符串 "ok"。参数 c 是与客户端通信的套接字文件描述符。
- `close()` 函数用于关闭与客户端的连接。

总结

这段代码实现了一个简单的TCP服务器,它创建一个套接字,绑定到本地地址和端口,监听客户端的连接请求,并与客户端进行数据交换。如果出现错误,程序将打印错误信息并退出。

2.2 cil客户端

客户端程序,用于连接到服务器并进行数据交换

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>int main()
{int sockfd = socket(AF_INET,SOCK_STREAM,0);//创建套接子 ipv4,tcp流式if( -1 == sockfd ){exit(1);}struct sockaddr_in saddr;//定义套接子地址,(服务器 ip + port)memset(&saddr,0,sizeof(saddr));saddr.sin_family = AF_INET;saddr.sin_port = htons(6000);saddr.sin_addr.s_addr = inet_addr("127.0.0.1");int res = connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));//连接服务器,if( -1 == res ){printf("connect err\n");exit(1);}printf("input\n");char buff[128] = {0};fgets(buff,128,stdin);send(sockfd,buff,strlen(buff)-1,0);//给服务器发送数据memset(buff,0,sizeof(buff));recv(sockfd,buff,127,0);//接收服务器返回的数据printf("buff=%s\n",buff);close(sockfd);exit(0);}
int res = connect(sockfd, (struct sockaddr*)&saddr, sizeof(saddr));
if (-1 == res) {printf("connect err\n");exit(1);
}
  • connect() 函数用于连接到服务器。

  • 参数 sockfd 是之前创建的套接字的文件描述符。

  • 参数 (struct sockaddr*)&saddr 是一个指向 saddr 结构体的指针,包含了服务器的地址信息。

  • 参数 sizeof(saddr)saddr 结构体的大小。

  • 如果连接失败,返回 -1,程序将打印错误信息并退出。

  • printf("input\n");
    char buff[128] = {0};
    fgets(buff, 128, stdin);
    send(sockfd, buff, strlen(buff) - 1, 0);
    memset(buff, 0, sizeof(buff));
    recv(sockfd, buff, 127, 0);
    printf("buff=%s\n", buff);
  • 提示用户输入数据。

  • 使用 fgets() 函数从标准输入读取一行数据,存储在 buff 中。

  • 使用 send() 函数将数据发送到服务器。注意,发送的数据长度是 strlen(buff) - 1,因为 fgets() 会将换行符也读取到缓冲区中。

  • 使用 memset() 函数清空 buff,为接收数据做准备。

  • 使用 recv() 函数从服务器接收数据,最多接收127字节。

  • 打印接收到的数据。

  • 这段代码实现了一个简单的客户端程序,它连接到本地服务器(127.0.0.1:6000),发送用户输入的数据,并接收服务器返回的数据。如果连接或数据传输失败,程序将打印错误信息并退出。

相关文章:

Tcp——客户端服务器

Tcp——客户端服务器 目录 一、基本概念 二、代码 2.1 ser服务器 2.2 cil客户端 一、基本概念 TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。在TCP/IP模型中&#xff0c;TCP位于IP层之上&#xff0c;应用层之下&#x…...

《HarmonyOS Next开发进阶:打造功能完备的Todo应用华章》

章节 6&#xff1a;日期选择器与日期处理 目标 学习如何使用DatePicker组件。理解日期格式化和日期计算。 内容 日期选择器基础 使用DatePicker组件。处理日期选择事件。 日期格式化 格式化日期为友好的文本。 日期计算 判断日期是否过期或即将到期。 代码示例 Entry Com…...

化学方程式配平 第33次CCF-CSP计算机软件能力认证

很经典的大模拟题目 但是还不算难 大模拟题最需要注意的就是细节 写代码一定要考虑全面 并且要细心多debug 多打断点STL库的熟练使用 istringstream真的处理字符串非常好用 注意解耦合思想 这样改代码debug更加清晰 https://www.acwing.com/problem/content/5724/ #includ…...

数据结构【链表】

链表 1.单链表1.1概念与结构1.1.1结点1.1.2链表的性质1.1.3链表的打印 1.2实现单链表1.3链表的分类 2.双向链表2.1概念与结构2.2实现双链表 3.顺序表与链表的分析 1.单链表 1.1概念与结构 概念&#xff1a;链表是⼀种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据…...

AIP-210 Unicode

编号210原文链接AIP-210: Unicode状态批准创建日期2018-06-28更新日期2018-06-28 API在处理&#xff08;解释、限制长度、计费&#xff09;字符串值和字符串编码时&#xff0c;应当保持一致&#xff0c;范围从理解上的歧义&#xff08;如域“限制为1024个字符”&#xff09;到…...

WiFi(无线局域网)技术的多种工作模式

WiFi&#xff08;无线局域网&#xff09;技术支持多种工作模式&#xff0c;以满足不同的网络需求和应用场景。以下是主要的WiFi工作模式及其详细说明&#xff1a; 1. 基础设施模式&#xff08;Infrastructure Mode&#xff09; [无线接入点 (AP)]/ | \ [客户端…...

游戏引擎学习第198天

回顾并为今天的内容设定 今天我们有一些代码需要处理。昨天我们进行了一些调试界面的整合工作&#xff0c;之前我们做了一些临时的、粗糙的操作&#xff0c;将一些东西读进来并放到调试界面中。今天&#xff0c;我们并不打算进行大规模的工作&#xff0c;更多的是对之前的代码…...

git命令简陋版本

git push git pull 临时仓库暂存区 ##############创建提交################ git init #创建git地址 git config --global user.name "***YQ1007" git config --global user.email "***gmail.com" git remote…...

MySQL 进阶 面经级

会用数据库&#xff0c;找大厂工作是远远不够的。 本人2025美团暑期AI面试好几个MySQL场景问题不会答&#xff0c;已脏面评。遂在此整理学习&#xff01; 文章目录 美团AI面1.数据库分片sharding的概念&#xff0c;它有什么优势和挑战?优势Sharding 挑战 2. 分库分表的常见策…...

JavaScript数组Array的使用:添加、删除、排序、遍历、互转

1、数组的概述 数组是存储于一个连续空间且具有相同数据类型的元素集合。可以把数组看作一张单行表格,该表格的每一个单元格都可以存储一个数据,而且各单元格中存储的数据类型可以不同。这些单元格被称为数组元素,每个数组元素都有一个索引号,通过索引号可以方便地引用数组…...

Vue Transition组件类名+TailwindCSS

#本文教学结合TailwindCSS实现一个Transition动画的例子# 举例代码&#xff1a; <transition enter-active-class"transition-all duration-300 ease-out"enter-from-class"opacity-0 translate-y-[-10px]"enter-to-class"opacity-100 translate-…...

蓝桥杯备赛:动态规划入门

写题的时候我发现&#xff1a;除了输入输出、循环、条件等基本语句一类的题目之外&#xff0c;我就什么都不会了&#xff0c;题目根本写不下去。 需要学&#xff1a;动态规划、哈希表、二分法、贪心算法等基本算法 现在什么都不会&#xff0c;对这些东西也是一点都不会懂&…...

【VSCode SSH 连接远程服务器】:身份验证时,出现 key: invalid format 的问题

从其它电脑上把私钥文件复制后&#xff0c;出现格式错误 很有可能是复制的时候引入了乱码 很有可能是复制的时候引入了乱码 因此直接从其它电脑上把私钥文件复制到新设备上即可&#xff01;&#xff08;不直接复制私钥的内容&#xff09; 亲测有效。...

git和VScode

游戏存档保存的是游戏的进度 git保存的是代码的进度 Vscode和git 要正常的使用git首先要设置姓名和邮箱 要配合gitee&#xff08;也可以是其他平台&#xff0c;以gitee举例&#xff09;使用&#xff0c;首先创造一个gitee账号&#xff0c;复制邮箱和用户名 在VScode中找到…...

c语言数据结构——八大排序算法实现

文章目录 八大排序算法排序算法种类选择排序类堆排序算法思路时间复杂度和空间复杂度 选择排序算法思路算法优化时间复杂度和空间复杂度 插入排序类插入排序算法思路时间复杂度和空间复杂度 希尔排序算法思路时间复杂度和空间复杂度 非比较排序类计数排序时间复杂度和空间复杂度…...

Python入门(5):异常

目录 1 异常处理基础概念 1.1 什么是异常&#xff1f; 1.2 异常与错误的区别 2 异常处理基础 2.1 常见内置异常类型 2.2 try-except 基本结构 2.3 捕获多个异常 2.4 抛出异常 2.4.1 使用raise语句 2.4.2 自定义异常类 3 高级异常处理技巧 3.1 不要过度捕…...

OpenCv(五)——边缘检测

目录 边缘检测 一、sobel算子边缘检测 &#xff08;1&#xff09;原理 1、X轴方向的边缘检测 2、Y轴方向的边缘检测 &#xff08;2&#xff09;sobel算子参数 &#xff08;3&#xff09;X轴方向边缘检测代码演示 1、显示圆的图像 2、x方向上的边缘检测&#xf…...

论文笔记:Instruction-Tuning Llama-3-8B Excels in City-Scale MobilityPrediction

2024 Sigspatial Hummob Workshop 第2/3名 提出了 Llama-3-8B-Mob——一个基于 Llama-3-8B的指令微调版本&#xff0c;专为长期、多城市人类移动预测而设计。 1 问题定义 2 方法 将轨迹预测问题重构为一个带有指令的问答任务 通过 GPT-3.5 和 4 进行实验&#xff0c;发现虽然…...

基础框架系列分享:一个通用的Excel报表生成管理框架

由于我们系统经常要生成大量的Excel报表&#xff08;Word&#xff0c;PDF报表也有&#xff0c;另行分享&#xff09;&#xff0c;最初始他们的方案是&#xff0c;设计一个表&#xff0c;和Excel完全对应&#xff0c;然后读表&#xff0c;把数据填进去&#xff0c;这显然是非常不…...

Linux安装Ubuntu24.04系统 并安装配置Nvidia 4090 显卡驱动

目录标题 方式一、离线安装一、检查确认系统的版本首先在终端输入下载注意:注意, 后面带notebook的是笔记本的驱动,不要下载错了点击view点击下载二、安装我选择的是 NVIDIA Proprietary.安装完成之后,再次检查补充步骤三:禁用默认nouveau显卡驱动,后重启系统补充步骤四:…...

Deepdiff的使用实战记录

使用场景&#xff1a;在做数据库迁移 或 底层代码重构优化&#xff0c;用于对比新旧代码的接口层返回数据对比 1.模拟在新改造的接口上新加了字段is_ok&#xff0c;且时间戳字段精度变成毫秒&#xff0c;img字段域名变更&#xff0c;能准确对比。 api_old {"ret":…...

C语言:多线程

多线程概述 定义 多线程是指在一个程序中可以同时运行多个不同的执行路径&#xff08;线程&#xff09;&#xff0c;这些线程可以并发或并行执行。并发是指多个线程在宏观上同时执行&#xff0c;但在微观上可能是交替执行的&#xff1b;并行则是指多个线程真正地同时执行&…...

Linux(25)——进程调度

目录 一、Linux 进程调度&#xff1a; 二、进程优先级&#xff1a; 1、普通调度策略&#xff1a; 2、完全公平调度程序&#xff1a; 三、nice 值&#xff1a; 1、nice 值范围&#xff1a; 2、nice 值修改权限&#xff1a; &#xff08;1&#xff09;降低&#xff1a; …...

SAP CO88根据标准价格拆分增量错误解决

CO88事务码可能出现如下错误&#xff0c;错误消息号 MLCCS015。出现该错误&#xff0c;表示成本组件分解出现了问题&#xff0c;参照 MLCCS015 错误的帮助文档&#xff1a; 其实这里已经说明了原因和解决方法&#xff0c;但不是很具体。note 632752 - Use of the program MLCCS…...

spring boot 整合redis

1.在pom文件中添加spring-boot-starter-data-redis依赖启动器 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2.编写三个实体类 RedisHash("p…...

游戏被外挂攻破?金融数据遭篡改?AI反作弊系统实战方案(代码+详细步骤)

一、背景与需求分析 随着游戏行业与金融领域的数字化进程加速,作弊行为(如游戏外挂、金融数据篡改)日益复杂化。传统基于规则的防御手段已难以应对新型攻击,而AI技术通过动态行为分析、异常检测等能力,为安全领域提供了革命性解决方案。本文以游戏反作弊系统和金融数据安…...

【JavaWeb】前端基础

JavaWeb 前端三大件&#xff1a;HTML&#xff08;主要用于网页主体结构的搭建&#xff09;&#xff0c;CSS&#xff08;页面美化&#xff09;&#xff0c;JavaScript&#xff08;主要用于页面元素的动态代理&#xff09; 1. HTML 1.1 html概述 HTML&#xff1a;Hyper Text …...

STM32智能手表——任务线程部分

RTOS和LVGL我没学过&#xff0c;但是应该能硬啃这个项目例程 ├─Application/User/Tasks # 用于存放任务线程的函数 │ ├─user_TaskInit.c # 初始化任务 │ ├─user_HardwareInitTask.c # 硬件初始化任务 │ ├─user_RunModeTasks.c…...

Java线程池详解

摘要&#xff1a;线程池是Java高并发编程的核心组件&#xff0c;有效管理线程生命周期并提升系统性能。本文将深入剖析Java线程池的实现原理、配置策略及生产环境中的实战技巧&#xff0c;助您构建高效稳定的多线程应用。 一、线程池核心价值 1.1 为什么需要线程池&#xff1f…...

Git Fetch 和 Git Pull 的区别

Git fetch和git pull的区别 二者都能够从远程获取最新版本到本地。 1. Git fetch 仅从远程获取最新版本到本地&#xff0c;不会进行 merge&#xff08;合并&#xff09;操作。 操作示例 从远程的 origin的 master 主分支上获取最新版本到 origin/master 分支上&#xff1a…...

《2核2G阿里云神操作!Ubuntu+Ollama低成本部署Deepseek模型实战》

简介&#xff1a; “本文为AI开发者揭秘如何在阿里云2核2G轻量级ECS服务器上&#xff0c;通过Ubuntu系统与Ollama框架实现Deepseek模型的高效部署。无需昂贵硬件&#xff0c;手把手教程涵盖环境配置、资源优化及避坑指南&#xff0c;助力初学者用极低成本在云端跑通行业领先的大…...

Rust闭包详解

文章目录 闭包捕获外部变量移动和借用闭包的特性闭包和性能闭包和生命周期 闭包 Rust中的闭包是一种匿名函数&#xff0c;可以捕获并存储环境中的变量&#xff0c;有点类似于Lambda表达式 闭包允许在其定义的作用域之外访问变量&#xff0c;并且可以在需要时将其移动或者借用…...

科技潮流出行新体验 方程豹全新车型钛3正式开启预售

科技潮流出行新体验&#xff0c;比亚迪个性化品牌方程豹旗下全新车型钛3正式开启预售&#xff0c;钛3定位科技潮品SUV&#xff0c;搭载独有的潮流配置“1机3舱”&#xff0c;以及“iCT”安全三件套、“E2C”智能三件套&#xff0c;实现了科技越级、空间越级、配置越级&#xff…...

如何将AI模型返回的字符串转为html元素?

场景&#xff1a; 接入deepseek模型的api到我们平台&#xff0c;返回的字符串需要做下格式化处理。 返回的数据是这样的&#xff1a; {"role": "assistant","content": "<think>\n嗯&#xff0c;用户问的是“星体是什么”。首先&am…...

使用SpringBoot + Thymeleaf + iText实现动态PDF导出

使用SpringBoot Thymeleaf iText实现动态PDF导出 1.前端模版代码&#xff0c;需要注意&#xff0c;iText有很多高级样式兼用性不好&#xff0c;需要自己试错&#xff1a; <!DOCTYPE html> <html lang"en" xmlns:th"http://www.thymeleaf.org"…...

Redis 源码硬核解析系列专题 - 扩展篇:Gossip协议的具体实现

1. 引言 Redis Cluster使用Gossip协议实现节点间的状态同步和一致性维护。Gossip协议是一种去中心化的通信机制,通过节点间的“谣言传播”方式交换信息,具有高容错性和扩展性。本篇将深入剖析Redis中Gossip协议的具体实现,包括消息格式、传播机制和故障检测逻辑。 2. Gossi…...

scGPT环境安装

scGPT环境安装 conda create -n scgpt_2 conda activate scgpt_2 conda install python3.10.11 cudatoolkit11.7 cudatoolkit-dev gxx>6.0.0,<12.0 cudnn -c conda-forge pip install torch1.13.0cu117 torchvision0.14.0cu117 torchaudio0.13.0 --extra-index-url https…...

linux服务器组建与管理

环境: DNSSamba服务器 ip:192.168.177.153 FTP服务器 ip:192.168.177.152 pc ip:192.168.177.151 这里先把DNS的ip及DNS固定给固定了,免得我关机了还会更改 网络配置:(前面的命令是DNS/Samba的后面的是FTP的,下面那张是示例图) sudo nmcli con mod ens33 ipv4.addres…...

vue3 生命周期函数(挂载、更新、销毁)

在这之前&#xff0c;相必用户也是用过vue2的经历&#xff0c;所以&#xff0c;在讲解之前先对vue2和vue3的生命周期进行对比&#xff1a; Option API组合APIbeforeCreate-setupcreated-setupbeforeMountonBeforeMountmountedonMountedbeforeUpdateonBeforeUpdateupdatedonUpd…...

树莓派超全系列教程文档--(20)树莓派配置自动息屏

树莓派配置自动息屏 配置自动息屏桌面Raspberry Pi 配置CLI 控制台设置控制台模式自动息屏查看当前自动息屏设置 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置自动息屏 您可以将 Raspberry Pi 配置为在一段时间不活动后自动息屏。默认情况…...

基于 Qt / HTTP/JSON 的智能天气预报系统测试报告

目录 一、项目概述 1.1项目背景 1.2项目目标 二、功能需求 2.1 用户界面功能 2.2 后台功能 三、技术选择 3.1 开发框架与工具 3.2 第三方 API 四、UI设计 4.1界面展示 4.2stylesheet样式 五、代码实现 1.构造函数 2.网络请求响应处理函数 3.处理json数据 4.更新…...

Oracle数据库数据编程SQL<3.7 PL/SQL 触发器(Trigger)>

触发器是Oracle数据库中的一种特殊存储过程&#xff0c;它会在特定数据库事件发生时自动执行。触发器通常用于实现复杂的业务规则、数据验证、审计跟踪等功能。 目录 一、触发器基本概念 1. 触发器特点 2. 触发器组成要素 二、触发器类型 1. DML触发器 2. DDL触发器 3.…...

反常积分和定积分的应用 1

网课 还是得跟上网课的进度。但是不要给自己太大的压力。看到数学题确实有点慌张。老师为什么说写对了不要打对号&#xff0c;我感觉打对号可以给自己充足的正反馈。关键问题就是能做对的题不多。这篇笔记主要整理网课的一些笔记。网课落下的比较多&#xff0c;大概还需要补好…...

Day49 | 11. 盛最多水的容器、16. 最接近的三数之和、33. 搜索旋转排序数组、36. 有效的数独

11. 盛最多水的容器 题目链接&#xff1a;11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 题目难度&#xff1a;中等 代码&#xff1a; class Solution {public int maxArea(int[] height) {int i0,jheight.length-1,res0;while(i<j){resheight[i]<heig…...

31天Python入门——第20天:魔法方法详解

你好&#xff0c;我是安然无虞。 文章目录 魔法方法1. __new__和__del__2. __repr__和__len__3. __enter__和__exit__4. 可迭代对象和迭代器5. 中括号[]数据操作6. __getattr__、__setattr__ 和 __delattr__7. 可调用的8. 运算符 魔法方法 魔法方法: Python中的魔法方法是一类…...

WPF 浅述IsHitTestVisible属性

WPF 浅述IsHitTestVisible属性 IsHitTestVisible 属性是 WPF 中一个非常重要的属性&#xff0c;它决定了一个控件是否可以作为 hit test 的一部分被检测到。理解这个属性对于处理交互事件&#xff08;如鼠标点击、触摸等&#xff09;非常重要。 IsHitTestVisible 属性的含义&am…...

WSN 经典定位算法

WSN 经典定位算法 包括&#xff1a; Centoid, Bounding_box, Grid_Scan, RSSI, DV_hop, MDS_MAP&#xff0c;APIT-WSN Localization/Amorphous/Amorphous.m , 3351 Localization/APIT/APIT.m , 4169 Localization/APIT/PPIT.m , 3889 Localization/Bounding Box/Bounding_Box.…...

LLM 优化技术(1)——Scaled-Dot-Product-Attention(SDPA)

在 Transformer 中抛弃了传统的 CNN 和 RNN&#xff0c;整个网络结构完全由Scaled Dot Product Attention 和Feed Forward Neural Network组成。一个基于 Transformer 的可训练的神经网络可以通过堆叠 Transformer 的形式进行搭建&#xff0c;Attention is All You Need论文中通…...

【深度学习】嘿马深度学习目标检测教程第1篇:商品目标检测要求、目标,1.1 项目演示【附代码文档】

教程总体简介&#xff1a;要求 目标 1.1 项目演示 学习目标 1.1 图像识别背景 1.2 什么是目标检测 1.2.1 目标检测定义 1.2.1.1 物体 1.3 目标检测应用场景 1.3.1 行业 1.3.2 应用类别 1.4 开发环境搭建 目标检测概述 3.1 目标检测任务描述 3.1.4 目标定位的简单实现 项目实现 …...

【蓝桥杯】单片机设计与开发,RTC实时时钟

一、RTC-DS1302概述 二、BCD码 三、三线协议概述 四、RTC的应用 五、DS1302的驱动函数 六、操作流程 七、三线协议驱动程序...