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

2024 - 两台CentOS服务器上的1000个Docker容器(每台500个)之间实现UDP通信(C语言版本)

两台CentOS服务器上的1000个Docker容器(每台500个)之间实现UDP通信(C语言版本) 给女朋友对象写得,她不会,我就写了一个

  • 为了帮助您在两台CentOS服务器上的1000个Docker容器(每台500个)之间实现UDP通信,我将详细地逐步指导您完成整个过程。我们将使用C语言编写UDP服务器和客户端程序,并使用Docker来管理容器和网络配置。

  • 我会在每个步骤中明确指出您需要修改的地方,以及需要特别注意的事项。由于您是初学者,我会尽量以简单易懂的方式来解释。

  • 请您一步一步来看 ,仔细阅读里面相关的注意事项哦~~

重点:

❤️:你拿到过后,你先仔细的全部浏览一遍,再去动手操作哦~


目录

  1. 环境准备
    • 安装Docker
    • 检查网络连通性
  2. 编写UDP服务器程序
    • 代码示例
    • 详细注释
  3. 编写UDP客户端程序
    • 代码示例
    • 详细注释
  4. 创建Docker镜像
    • 编写Dockerfile
    • 构建镜像
  5. 运行服务器容器(服务器A)
    • 编写运行脚本
    • 解释脚本内容
  6. 运行客户端容器(服务器B)
    • 编写运行脚本
    • 解释脚本内容
  7. 网络和防火墙配置
    • 修改防火墙设置
    • 检查网络连接
  8. 验证通信
    • 检查服务器日志
    • 确认消息接收
  9. 注意事项和可能的问题
    • 系统资源限制
    • 防火墙和安全性
    • 日志和监控
  10. 总结

1. 环境准备

1.1 安装Docker (这个我们安装了,可以 跳过了!❤️)

在两台CentOS服务器上都需要安装Docker。如果还未安装,请按照以下步骤进行:

# 更新包索引
sudo yum update -y# 安装必要的包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2# 添加Docker仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 安装Docker CE
sudo yum install -y docker-ce docker-ce-cli containerd.io# 启动Docker服务
sudo systemctl start docker# 设置Docker开机自启
sudo systemctl enable docker

注意:

  • 权限问题:默认情况下,只有root用户或docker组的用户才能运行Docker命令。为了方便,您可以将当前用户添加到docker组:

    sudo usermod -aG docker $(whoami)
    

    然后退出并重新登录以使更改生效。

1.2 检查网络连通性(但是 我们需要 检测两台服务器是否可以走的通的!⚠️)(从这一步出发 ❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️)

确保两台服务器之间可以互相访问。

  • 测试连接

    # 在服务器B上,尝试ping服务器A
    ping <服务器A的IP地址>
    
  • 注意:如果ping不通,可能需要检查网络配置或联系网络管理员。


2. 编写UDP服务器程序 (下面是 重点了,请您仔细阅读,一步一步来,不要着急)

在服务器A上,创建一个目录来存放代码:

mkdir ~/udp_project
cd ~/udp_project
2.1 代码示例

创建一个名为udp_server.c的文件,内容如下:

// udp_server.c/** UDP服务器程序* 监听指定的UDP端口并接收消息。** 编译:*   gcc -o udp_server udp_server.c** 用法:*   ./udp_server <端口号>*/#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>#define BUFFER_SIZE 1024  // 接收消息的最大缓冲区大小int main(int argc, char *argv[]) {int sockfd;                        // 套接字文件描述符int port;                          // 监听的端口号struct sockaddr_in server_addr;    // 服务器地址结构struct sockaddr_in client_addr;    // 客户端地址结构char buffer[BUFFER_SIZE];          // 接收消息的缓冲区socklen_t addr_len;                // 客户端地址结构的大小ssize_t recv_len;                  // 接收到的消息长度// 检查参数数量是否正确if (argc != 2) {fprintf(stderr, "用法: %s <端口号>\n", argv[0]);exit(1);}// 将端口号从字符串转换为整数port = atoi(argv[1]);// 创建UDP套接字if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {perror("socket 创建失败");exit(1);}// 将服务器地址结构清零memset(&server_addr, 0, sizeof(server_addr));// 设置地址族为AF_INET(IPv4)server_addr.sin_family = AF_INET;// 监听所有可用的网络接口server_addr.sin_addr.s_addr = INADDR_ANY;// 设置端口号(将主机字节序转换为网络字节序)server_addr.sin_port = htons(port);// 将套接字绑定到指定的端口上if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {perror("绑定失败");close(sockfd);exit(1);}printf("UDP服务器正在监听端口 %d\n", port);// 无限循环,持续接收消息while (1) {addr_len = sizeof(client_addr);// 接收消息recv_len = recvfrom(sockfd, buffer, BUFFER_SIZE - 1, 0,(struct sockaddr *)&client_addr, &addr_len);if (recv_len < 0) {perror("接收失败");continue;}// 在接收到的数据末尾添加字符串结束符buffer[recv_len] = '\0';// 打印客户端信息和消息内容printf("从 %s:%d 收到消息:%s\n",inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), buffer);}// 关闭套接字(实际上不会到达这里)close(sockfd);return 0;
}
2.2 详细注释
  • 头文件包含:包含了网络编程和基本的C库函数所需的头文件。
  • 宏定义:定义了缓冲区大小BUFFER_SIZE
  • main函数参数检查:确保运行程序时传入了正确的参数(端口号)。
  • 套接字创建:使用socket()函数创建一个UDP套接字。
  • 地址结构初始化:使用memset()清零,然后设置地址族、IP地址和端口号。
  • 绑定套接字:使用bind()函数将套接字绑定到指定的IP和端口上。
  • 接收循环:使用recvfrom()函数接收来自客户端的消息,并打印出来。

3. 编写UDP客户端程序

在服务器B上,同样创建一个目录:

mkdir ~/udp_project
cd ~/udp_project
3.1 代码示例

创建一个名为udp_client.c的文件,内容如下:

// udp_client.c/** UDP客户端程序* 向指定的IP地址和UDP端口发送消息。** 编译:*   gcc -o udp_client udp_client.c** 用法:*   ./udp_client <服务器IP> <服务器端口> <消息>*/#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>#define BUFFER_SIZE 1024  // 消息的最大缓冲区大小int main(int argc, char *argv[]) {int sockfd;                        // 套接字文件描述符char *server_ip;                   // 服务器IP地址int server_port;                   // 服务器端口号struct sockaddr_in server_addr;    // 服务器地址结构char *message;                     // 要发送的消息ssize_t sent_len;                  // 发送的消息长度// 检查参数数量是否正确if (argc != 4) {fprintf(stderr, "用法: %s <服务器IP> <服务器端口> <消息>\n", argv[0]);exit(1);}// 获取服务器IP、端口和消息server_ip = argv[1];server_port = atoi(argv[2]);message = argv[3];// 创建UDP套接字if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {perror("socket 创建失败");exit(1);}// 将服务器地址结构清零memset(&server_addr, 0, sizeof(server_addr));// 设置地址族为AF_INET(IPv4)server_addr.sin_family = AF_INET;// 将IP地址从文本转换为二进制形式if (inet_pton(AF_INET, server_ip, &server_addr.sin_addr) <= 0) {fprintf(stderr, "无效的IP地址:%s\n", server_ip);close(sockfd);exit(1);}// 设置端口号(网络字节序)server_addr.sin_port = htons(server_port);// 发送消息到服务器sent_len = sendto(sockfd, message, strlen(message), 0,(struct sockaddr *)&server_addr, sizeof(server_addr));if (sent_len < 0) {perror("发送失败");close(sockfd);exit(1);}printf("已向 %s:%d 发送消息:%s\n", server_ip, server_port, message);// 关闭套接字close(sockfd);return 0;
}
3.2 详细注释
  • 参数检查:确保提供了服务器IP、端口和消息。
  • 套接字创建:同样使用socket()函数创建UDP套接字。
  • 地址结构设置:将服务器的IP和端口填入server_addr结构。
  • 发送消息:使用sendto()函数发送消息到服务器。

4. 创建Docker镜像

4.1 编写Dockerfile

在两台服务器的udp_project目录下,创建一个名为Dockerfile的文件,内容如下:

# 使用官方的GCC镜像作为基础镜像
FROM gcc:latest# 在容器内创建工作目录
WORKDIR /usr/src/app# 将源代码复制到容器内
COPY udp_server.c udp_client.c ./# 编译UDP服务器和客户端程序
RUN gcc -o udp_server udp_server.c
RUN gcc -o udp_client udp_client.c# 暴露默认端口(可在运行时覆盖)
EXPOSE 5000/udp# 设置默认命令(可在运行容器时覆盖)
CMD ["./udp_server", "5000"]

解释:

  • FROM:指定基础镜像为官方的gcc镜像,包含了GCC编译器。
  • WORKDIR:设置工作目录为/usr/src/app
  • COPY:将udp_server.cudp_client.c复制到容器内的工作目录。
  • RUN:编译服务器和客户端程序。
  • EXPOSE:暴露5000端口的UDP协议(可在运行时指定其他端口)。
  • CMD:设置容器启动时默认执行的命令。
4.2 构建镜像

在两个服务器的udp_project目录下,执行以下命令构建Docker镜像:

docker build -t udp_app .

注意:

  • 镜像名称udp_app是镜像的名称,您可以根据需要更改。
  • 构建过程:Docker会根据Dockerfile的指令一步步构建镜像。

5. 运行服务器容器(服务器A)

5.1 编写运行脚本

在服务器A的udp_project目录下,创建一个名为run_servers.sh的脚本,内容如下:

#!/bin/bash# 要运行的服务器容器数量
NUM_CONTAINERS=500# 服务器的基础端口号
BASE_PORT=5000for (( i=1; i<=NUM_CONTAINERS; i++ ))
doCONTAINER_NAME="server_$i"HOST_PORT=$((BASE_PORT + i))CONTAINER_PORT=$((BASE_PORT + i))# 运行服务器容器docker run -d --name $CONTAINER_NAME -p $HOST_PORT:$CONTAINER_PORT/udp udp_app ./udp_server $CONTAINER_PORTecho "已在端口 $HOST_PORT 启动服务器容器 $CONTAINER_NAME"
done
5.2 解释脚本内容
  • 循环:从1到500,依次启动500个容器。
  • 容器名称server_1server_2、…、server_500
  • 端口设置
    • 主机端口HOST_PORT,从5001到5500。
    • 容器端口CONTAINER_PORT,与主机端口相同。
  • 运行容器
    • -d:后台运行容器。
    • --name:指定容器名称。
    • -p:将主机的UDP端口映射到容器的UDP端口。
    • udp_app:使用之前构建的镜像。
    • ./udp_server $CONTAINER_PORT:在容器内执行的命令,指定监听的端口。

需要您修改的地方:

  • NUM_CONTAINERS:如果您想运行不同数量的容器,可以修改这个值。

6. 运行客户端容器(服务器B)

6.1 编写运行脚本

在服务器B的udp_project目录下,创建一个名为run_clients.sh的脚本,内容如下:

#!/bin/bash# 要运行的客户端容器数量
NUM_CONTAINERS=500# 客户端的基础端口号(用于区分消息)
BASE_PORT=5000# 服务器A的IP地址
SERVER_A_IP="请替换为服务器A的实际IP地址"for (( i=1; i<=NUM_CONTAINERS; i++ ))
doCONTAINER_NAME="client_$i"SERVER_PORT=$((BASE_PORT + i))MESSAGE="来自客户端 $i 的问候"# 运行客户端容器docker run -d --name $CONTAINER_NAME udp_app ./udp_client $SERVER_A_IP $SERVER_PORT "$MESSAGE"echo "已启动客户端容器 $CONTAINER_NAME,发送到 $SERVER_A_IP:$SERVER_PORT"
done
6.2 解释脚本内容
  • 服务器IP地址:需要将SERVER_A_IP替换为服务器A的实际IP地址。
  • 循环:启动500个客户端容器。
  • 容器名称client_1client_2、…、client_500
  • 服务器端口:与服务器容器的端口对应,从5001到5500。
  • 消息内容:每个客户端发送一条包含自己编号的消息。
  • 运行容器
    • -d:后台运行。
    • --name:容器名称。
    • udp_app:使用同样的镜像。
    • ./udp_client $SERVER_A_IP $SERVER_PORT "$MESSAGE":在容器内执行的命令,指定服务器IP、端口和消息。

需要您修改的地方:

  • SERVER_A_IP:❤️一定要替换为服务器A的实际IP地址,否则客户端无法连接到服务器❤️。
  • NUM_CONTAINERS:如果需要,可以修改客户端容器的数量❤️。

7. 网络和防火墙配置

7.1 修改防火墙设置(服务器A)

为了允许UDP流量通过指定的端口,需要修改防火墙设置。

# 添加端口范围的UDP规则
sudo firewall-cmd --zone=public --add-port=5001-5500/udp --permanent# 重新加载防火墙
sudo firewall-cmd --reload

注意:

  • 防火墙软件:如果使用的是firewalld,上述命令适用。如果使用其他防火墙,需要使用相应的命令。
  • 端口范围:确保与您在脚本中使用的端口范围一致。
7.2 检查网络连接

在服务器B上,测试是否可以连接到服务器A的指定端口。

# 使用nc(netcat)工具测试UDP端口
echo "测试" | nc -u -v <服务器A的IP地址> 5001

如果连接成功,说明网络连通性正常。


8. 验证通信

8.1 检查服务器日志

在服务器A上,查看某个服务器容器的日志,例如server_1

docker logs server_1

您应该看到类似以下的输出:

UDP服务器正在监听端口 5001
从 <客户端IP>:<端口> 收到消息:来自客户端 1 的问候
8.2 确认消息接收
  • 多个容器日志:可以检查其他服务器容器的日志,确认是否收到了对应客户端的消息。
  • 故障排查:如果没有收到消息,请检查以下内容:
    • 服务器A的防火墙设置:确保开放了必要的UDP端口。
    • 服务器IP地址是否正确:在run_clients.sh脚本中。
    • 网络连通性:使用pingnc测试。

9. 注意事项和可能的问题

9.1 系统资源限制
  • CPU和内存:运行大量容器会占用大量系统资源。请监控系统的CPU和内存使用情况。

  • 文件描述符限制:可能需要增加系统的文件描述符限制。

    # 临时增加限制
    ulimit -n 65535
    
9.2 防火墙和安全性
  • 安全策略:确保只允许可信任的流量。对于生产环境,建议使用VPN或设置访问控制。
  • 端口范围:开放大量端口可能存在安全风险,务必确保网络的安全性。
9.3 日志和监控
  • 日志收集:考虑使用日志收集工具,如ELK堆栈,来集中管理容器日志。
  • 监控工具:使用监控工具,如Prometheus和Grafana,监控系统性能和容器状态。

10. 总结

通过以上步骤,您已经成功在两台CentOS服务器上的1000个Docker容器之间建立了UDP通信。我们使用C语言编写了简单的UDP服务器和客户端程序,并利用Docker来管理容器的部署。

您需要注意的关键点:

  • IP地址和端口号:确保在脚本和代码中使用正确的IP地址和端口号。
  • 防火墙配置:确保防火墙允许必要的UDP流量通过。
  • 系统资源:监控系统的资源使用,防止过载。
  • 代码编译:如果修改了C代码,需要重新构建Docker镜像。

相关文章:

2024 - 两台CentOS服务器上的1000个Docker容器(每台500个)之间实现UDP通信(C语言版本)

两台CentOS服务器上的1000个Docker容器&#xff08;每台500个&#xff09;之间实现UDP通信(C语言版本) 给女朋友对象写得&#xff0c;她不会&#xff0c;我就写了一个 为了帮助您在两台CentOS服务器上的1000个Docker容器&#xff08;每台500个&#xff09;之间实现UDP通信&…...

小程序该如何上架

小程序的上架流程通常包括准备工作、代码审核、人工审核以及上线发布等关键步骤。以下是一个详细的小程序上架指南&#xff1a; 一、准备工作 注册开发者账号&#xff1a; 在微信小程序平台或支付宝开放平台等相应的小程序发布平台上注册开发者账号。 开发小程序&#xff1a; …...

XMOJ3065 旅游线路

10分钟没啥思路就去看题解了&#xff0c;结果发现很蠢。 题目大意 有一条河&#xff0c;河的东侧和西侧分别有 n , m n,m n,m 个景点&#xff0c;每个景点有个权值。有 k k k 条船&#xff0c;每条船连接东侧和西侧的一个景点。定义一个旅游线路是通过船连接起来的景点序列…...

量化之一:均值回归策略

文章目录 均值回归策略理论基础数学公式 关键指标简单移动平均线&#xff08;SMA&#xff09;标准差Z-Score 交易信号实际应用优缺点分析优点缺点 结论 实践backtrader参数&#xff1a;正常情况&#xff1a;异常情况&#xff1a; 均值回归策略 均值回归&#xff08;Mean Rever…...

NVIDIA Bluefield DPU上的启动流程4个阶段分别是什么?作用是什么?

文章目录 Bluefield上的硬件介绍启动流程启动流程:eMMC中的两个存储分区:ATF介绍ATF启动的四个阶段:四个主要步骤:各个阶段依赖的启动文件一次烧录fw失败后的信息看启动流程综述Bluefield上的硬件介绍 本文以Bluefield2为例,可以看到RSHIM实际上是Boot相关的集合。也能看…...

最优美公式-欧拉公式,轻松理解版

Alan Becker创作的火柴人大战数学的打斗视频&#xff0c;风靡一时&#xff0c;并在B站荣耀斩获了“金知奖”。下面是网友对此视频的部分评价截图。 视频原址&#xff1a;火柴人 vs 数学&#xff0c;后续又一口气看完了“火柴人vs 几何”与“火柴人vs 物理”&#xff0c;通过火柴…...

【力扣 | SQL题 | 每日3题】力扣1107,1112, 1077

今天三道mid题都可以用窗口函数轻松秒杀。 1. 力扣1107&#xff1a;每日新用户统计 1.1 题目&#xff1a; Traffic 表&#xff1a; ------------------------ | Column Name | Type | ------------------------ | user_id | int | | activity | enum …...

计算机网络(十一) —— 数据链路层

目录 一&#xff0c;关于数据链路层 二&#xff0c;以太网协议 2.1 局域网 2.2 Mac地址 2.3 Mac帧报头 2.4 MTU 三&#xff0c;ARP协议 3.1 ARP是什么 3.2 ARP原理 3.3 ARP报头 3.4 模拟ARP过程 3.5 ARP周边问题 四&#xff0c;NAT技术 4.1 NAT技术背景 4.2 NAT转…...

使用PyTorch从0实现Fashion-MNIST数据集分类

完整代码&#xff1a; from d2l import torch as d2l import torch from torchvision import transforms from torchvision import datasets from torch.utils.data import DataLoader import matplotlib.pyplot as plt from IPython import displaydef get_fashion_mnist_la…...

Java数组的值拷贝和地址拷贝

在Java中&#xff0c;数组的值拷贝和地址拷贝是两种不同的操作。 值拷贝是指将一个数组的值复制到另一个新的数组中。这意味着新数组和原数组独立存在&#xff0c;修改其中一个数组不会影响另一个数组。Java中的数组是对象&#xff0c;所以通过值拷贝操作实际上是复制了数组对…...

类与对象 中(剩余部分) 以及 日历

运算符重载 • 当运算符被⽤于类类型的对象时&#xff0c;C语⾔允许我们通过运算符重载的形式指定新的含义。C规定类类型对象使⽤运算符时&#xff0c;必须转换成调⽤对应运算符重载&#xff0c;若没有对应的运算符重载&#xff0c;则会编译报错。 • 运算符重载是具有特名字的…...

iOS 14 自定义画中画悬浮窗 Custom AVPictureInPictureController 实现方案

iOS 14&#xff0c;基于 AVPictureInPictureController&#xff0c;实现自定义画中画&#xff0c;涵盖所有功能与难点。 市面上的各种悬浮钟和提词器的原理都是基于此。 Demo源码在文末。 使用 iOS 画中画的要求&#xff1a; 真机&#xff0c;不能使用模拟器&#xff1b;iO…...

【C#生态园】完整解读C#网络通信库:从基础到实战应用

探索C#网络通信库&#xff1a;功能、用途和最佳实践 前言 随着互联网的快速发展&#xff0c;网络通信在现代软件开发中扮演着至关重要的角色。C#作为一种流行的编程语言&#xff0c;拥有多个优秀的网络通信库&#xff0c;为开发人员提供了丰富的选择。本文将深入探讨几种常用…...

js面试题---事件委托是什么

事件委托是JavaScript中的一种事件处理模式&#xff0c;通过将事件处理程序绑定到父元素&#xff0c;而不是直接绑定到每个子元素&#xff0c;从而优化事件管理和提高性能。 1 工作原理 事件冒泡&#xff1a;当一个事件在某个元素上发生时&#xff0c;它会从该元素向上冒泡到…...

谷歌浏览器 文件下载提示网络错误

情况描述&#xff1a; 谷歌版本&#xff1a;129.0.6668.90 (正式版本) &#xff08;64 位&#xff09; (cohort: Control)其他浏览器&#xff0c;比如火狐没有问题&#xff0c;但是谷歌会下载失败&#xff0c;故推断为谷歌浏览器导致的问题小文件比如1、2M会成功&#xff0c;大…...

【记录】PPT|PPT 箭头相交怎么跨过

众所周知&#xff0c;在PPT中实现“跨线”效果并非直接可行&#xff0c;这一功能仅存在于Visio中。然而&#xff0c;通过一些巧妙的方法&#xff0c;我们可以在PPT中模拟出类似的效果。怎么在PPT中画交叉但不重叠的线-百度经验中介绍了一种方法&#xff0c;而本文将介绍一种改进…...

Linux中如何修改root密码

在 Linux 中&#xff0c;修改 root 用户密码可以通过以下步骤进行。你需要具有超级用户权限才能执行这些操作。 方法一&#xff1a;使用 passwd 命令修改 root 密码 使用具有超级用户权限的账户登录 如果你已经以 root 身份登录&#xff0c;或者你当前账户具备超级用户权限&am…...

中间件:SpringBoot集成Redis

一、Redis简介 Redis是一个开源的、基于内存的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。Redis支持多种类型的数据结构&#xff0c;如字符串&#xff08;strings&#xff09;、哈希&#xff08;hashes&#xff09;、列表&#xff08;lists&#xff09…...

数据中心建设方案,大数据平台建设,大数据信息安全管理(各类资料原件)

第一章 解决方案 1.1 建设需求 1.2 建设思路 1.3 总体方案 信息安全系统整体部署架构图 1.3.1 IP准入控制系统 1.3.2 防泄密技术的选择 1.3.3 主机账号生命周期管理系统 1.3.4 数据库账号生命周期管理系统 1.3.5 双因素认证系统 1.3.6 数据库审计系统 1.3.7 数据脱敏…...

TDD(测试驱动开发)是否已死?

Rails 大神、创始人 David Heinemeier Hansson 曾发文抨击TDD。 TDD is dead. Long live testing. (DHH) 此后, Kent Beck、Martin Fowler、David Hansson 三人就这个观点还举行了系列对话&#xff08;辩论&#xff09; Is TDD Dead? 笔者作为一个多年在软件测试领域摸索的人&…...

Debezium系列之:实时从TDengine数据库采集数据到Kafka Topic

Debezium系列之:实时从TDengine数据库采集数据到Kafka Topic 一、认识TDengine二、TDengine Kafka Connector三、什么是 Kafka Connect?四、前置条件五、安装 TDengine Connector 插件六、启动 Kafka七、验证 kafka Connect 是否启动成功八、TDengine Source Connector 的使用…...

数据结构(一)顺序表

顺序表的概念及结构 线性表 线性表是具有相同特征的数据结构的集合 物理结构 不一定连续 逻辑结构 连续 顺序表 顺序表是线性表的一种&#xff0c;顺序表的底层是数组 物理结构 连续 逻辑结构 连续 顺序表分类 静态顺序表 struct SeqList {int a…...

如何在 Jupyter Notebook 执行和学习 SQL 语句(中)

1. 基础SQL操作 创建数据库和表&#xff0c;插入数据&#xff1a; import sqlite3# 创建SQLite数据库并连接 conn sqlite3.connect(example.db) cursor conn.cursor()# 创建用户表 cursor.execute(CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT…...

AutosarMCAL开发——基于EB Wdg驱动

目录 一、Wdg原理以及作用1.看门狗类型2.看门狗功能特点3.看门狗工作模式4.看门狗超时响应5.看门狗寄存器 二、WDG模块EB配置&#xff08;TC3X系列MCU&#xff09;1.WDG通用配置&#xff1a;2.WDG设置&#xff1a;3.时钟资源分配4.配置STM IRQ中断5.配置触发执行动作&#xff1…...

Linux(1. 基本操作_命令)

目录 关于超级用户root&#xff1a; root用户可以做什么&#xff1f; 避免灾难&#xff1a; 格式约定&#xff1a; 浏览硬盘&#xff1a; 命令行补全和通配符&#xff1a; 命令行补全&#xff1a; 通配符&#xff1a; 常用基本命令&#xff1a; 查看目录和文件&#xff…...

难点:Linux 死机定位(进程虚拟地址空间耗尽)

死机定位(进程虚拟地址空间耗尽) 一、死机现象 内存富裕,但内存申请失败。 死机时打印: 怀疑是: 1、内存碎片原因导致。 2、进程虚拟地址空间耗尽导致。 3、进程资源限制导致。 二、内存碎片分析 1、理论知识:如何分析内存碎片化情况 使用 /proc/buddyinfo: /proc/…...

小米路由器刷机istoreOS,愉快上网

istoreOS与openwrt openwrt是一个开源的路由器系统,市场上所有小米路由器的内部系统都是基于openwrt进行二次开发形成的,做了硬件适配和功能上的阉割,不太好用。 istoreos是小宝团队基于openwrt制作的一个发行版,更适合中国宝宝体质。页面简约华丽,完全兼容开源openwrt的…...

微信小程序 - 01 - 一些补充和注意点(补充ing...)

目录 一、节流二、在一个发请求的函数中&#xff0c;只有发生下拉动作&#xff0c;才执行关闭下拉代码 最近在学微信小程序&#xff0c;把学习过程中的一些补充和注意点总结一下&#xff0c;内容会比较简单&#xff0c;因为只涉及基础知识&#xff0c;供个人参考 一、节流 情…...

微服务实战——登录(普通登录、社交登录、SSO单点登录)

登录 1.1. 用户密码 PostMapping("/login")public String login(UserLoginVo vo, RedirectAttributes redirectAttributes, HttpSession session){R r memberFeignService.login(vo);if(r.getCode() 0){MemberRespVo data r.getData("data", new Type…...

windows 安装 ElasticSearch

1、下载安装包 下载地址&#xff1a;https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.14.3-windows-x86_64.zip ElasticSearch 目录结构如下&#xff1a; 2、配置JDK环境 ES比较耗内存&#xff0c;建议虚拟机4G或以上内存&#xff0c;jvm1g以上的内存分…...