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

深入剖析 I/O 复用之 select 机制

深入剖析 I/O 复用之 select 机制

在网络编程中,I/O 复用是一项关键技术,它允许程序同时监控多个文件描述符的状态变化,从而高效地处理多个 I/O 操作。select 作为 I/O 复用的经典实现方式,在众多网络应用中扮演着重要角色。本文将深入探讨 select 的原理、使用方法、相关数据结构以及实际应用示例。

一、I/O 复用概述

I/O 复用使得程序能够同时监听多个文件描述符,适用于多种场景:

  • 客户端程序需要同时处理多个套接字。
  • 客户端要兼顾用户输入和网络连接处理。
  • TCP 服务器需同时管理监听套接字和已连接套接字。
  • 服务器要同时处理 TCP 请求和 UDP 请求。
  • 服务器需要监听多个端口。

二、select 原理

select 系统调用通过维护三个文件描述符集合(读集合、写集合和异常集合)来监视不同类型的事件。它会阻塞当前进程,直到有一个或多个文件描述符就绪(有数据可读、可写或发生异常),或者达到指定的超时时间。

三、select 使用方法

函数原型

#include <sys/select.h>  
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);  
  • nfds:需要监视的最大文件描述符编号加 1。
  • readfds:读文件描述符集合,用于监视文件描述符是否有数据可读。
  • writefds:写文件描述符集合,用于监视文件描述符是否可写。
  • exceptfds:异常文件描述符集合,用于监视文件描述符是否发生异常。
  • timeout:超时时间,指定 select 函数的最大阻塞时间。如果为 NULL,则会一直阻塞直到有文件描述符就绪。

fd_set 数据结构

fd_set 用于存储文件描述符集合,本质上是一个位图(bitmask)。每个文件描述符对应位图中的一位,若该位置为 1,则表示该文件描述符在集合内;若为 0,则表示不在集合内。

在这里插入图片描述

操作 fd_set 的宏函数

  • FD_ZERO(fd_set *set):将 fd_set 集合初始化为空,即把集合中所有位都置为 0。
  • FD_SET(int fd, fd_set *set):将指定的文件描述符 fd 添加到 fd_set 集合中,把对应位设置为 1。
  • FD_CLR(int fd, fd_set *set):从 fd_set 集合中移除指定的文件描述符 fd,将对应位设置为 0。
  • FD_ISSET(int fd, fd_set *set):检查指定的文件描述符 fd 是否在 fd_set 集合中。若在集合中则返回非零值,否则返回 0。

timeout 结构体

struct timeval {  long tv_sec; // 秒数  long tv_usec; // 微秒数  
};  

用于指定 select 函数的超时时间。

四、使用 select 实现 TCP 服务器示例代码解析

代码功能

此代码创建了一个 TCP 服务器,借助 select 函数实现 I/O 复用,能够同时处理多个客户端的连接与数据收发。服务器监听本地地址 127.0.0.16000 端口,当有新的客户端连接时会接受连接,接收客户端发送的数据,并向客户端回复 "ok"

代码逐段解析

头文件与常量定义
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <unistd.h>  
#include <sys/select.h>  
#include <sys/socket.h>  
#include <arpa/inet.h>  
#include <netinet/in.h>  #define MAXARR 10  

引入所需头文件,并定义常量 MAXARR 表示存储文件描述符数组的最大长度。

函数声明与实现
  • socket_init 函数
    int socket_init() {  int sockfd = socket(AF_INET, SOCK_STREAM, 0);  if (sockfd == -1) {  perror("socket err");  return -1;  }  struct sockaddr_in saddr;  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 = bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr));  if (res == -1) {  perror("bind err");  return -1;  }  if ((res = listen(sockfd, 5) < 0)) {  perror("listen err");  return -1;  }  return sockfd;  
    }  
    
    该函数用于初始化服务器套接字,包括创建套接字、绑定地址和端口、开始监听连接。若出现错误则返回 -1
  • arr_init 函数
    void arr_init(int arr[]) {  for (int i = 0; i < MAXARR; i++) {  arr[i] = -1;  }  
    }  
    
    把存储文件描述符的数组初始化为 -1,表示数组中没有有效的文件描述符。
  • arr_add 函数
    void arr_add(int arr[], int fd) {  for (int i = 0; i < MAXARR; i++) {  if (arr[i] == -1) {  arr[i] = fd;  break;  }  }  
    }  
    
    把新的文件描述符添加到数组中,找到第一个值为 -1 的位置,将新的文件描述符存入该位置。
  • arr_del 函数
    void arr_del(int arr[], int fd) {  for (int i = 0; i < MAXARR; i++) {  if (arr[i] == fd) {  arr[i] = -1;  break;  }  }  
    }  
    
    从数组中删除指定的文件描述符,找到该文件描述符所在的位置,将其值置为 -1
  • accept_cli 函数
    void accept_cli(int sockfd, int arr[]) {  int c = accept(sockfd, NULL, NULL);  if (c == -1) {  perror("accept err");  return;  }  printf("cli(%d) accept\n", c);  arr_add(arr, c);  
    }  
    
    接受新的客户端连接,若接受成功则将客户端的套接字文件描述符添加到数组中。
  • recv_cli 函数
    void recv_cli(int fd, int arr[]) {  char buff[128] = {0};  int n = recv(fd, buff, 127, 0);  if (n < 0) {  perror("recv err");  printf("cli(%d) close\n", fd);  close(fd);  arr_del(arr, fd);  return;  }  if (n == 0) {  printf("cli(%d) close\n", fd);  close(fd);  arr_del(arr, fd);  return;  }  printf("buff(c=%d):%s\n", fd, buff);  send(fd, "ok", 2, 0);  
    }  
    
    接收客户端发送的数据,若接收出错或者客户端关闭连接,则关闭对应的套接字并从数组中删除该文件描述符;若接收到数据,则打印数据并向客户端回复 "ok"
main 函数
int main() {  int sockfd = socket_init();  if (sockfd == -1) {  exit(1);  }  int arr[MAXARR];  arr_init(arr);  arr_add(arr, sockfd);  fd_set fdset;  while (1) {  FD_ZERO(&fdset);  int maxfd = -1;  for (int i = 0; i < MAXARR; i++) {  if (arr[i] == -1) {  continue;  }  FD_SET(arr[i], &fdset);  if (arr[i] > maxfd) {  maxfd = arr[i];  }  }  struct timeval tv = {5, 0};  int n = select(maxfd + 1, &fdset, NULL, NULL, &tv);  if (n == -1) {  perror("select err");  continue;  } else if (n == 0) {  printf("TIME OUT\n");  continue;  } else {  for (int i = 0; i < MAXARR; i++) {  if (arr[i] == -1) {  continue;  } else {  if (FD_ISSET(arr[i], &fdset)) {  if (arr[i] == sockfd) {  accept_cli(arr[i], arr);  } else {  recv_cli(arr[i], arr);  }  }  }  }  }  }  
}  
  • 初始化服务器套接字,若失败则退出程序。
  • 初始化存储文件描述符的数组,并将服务器套接字文件描述符添加到数组中。
  • 进入无限循环:
    • 每次循环开始时,清空 fd_set 集合。
    • 遍历数组,将有效的文件描述符添加到 fd_set 集合中,并找出最大的文件描述符。
    • 设置 select 函数的超时时间为 5 秒。
    • 调用 select 函数进行监听,根据返回值判断情况:若返回 -1 表示出错,打印错误信息并继续循环;若返回 0 表示超时,打印超时信息并继续循环;若返回大于 0 的值,表示有文件描述符就绪。
    • 再次遍历数组,检查哪些文件描述符就绪。若为服务器套接字,则调用 accept_cli 函数接受新的连接;若为客户端套接字,则调用 recv_cli 函数接收数据。

五、select 的优缺点

优点

  • 跨平台支持select 是一种标准的系统调用,几乎所有的 Unix/Linux 系统和 Windows 系统都支持,具有良好的跨平台性。
  • 简单易用select 的接口相对简单,使用起来比较方便,对于小规模的应用场景非常适用。

缺点

  • 文件描述符数量限制select 有最大文件描述符数量的限制,一般为 1024。如果需要处理大量的文件描述符,可能会受到限制。
  • 性能问题select 需要遍历所有的文件描述符来检查其状态,时间复杂度为 O(n),当文件描述符数量较多时,性能会受到影响。
  • 内核和用户空间数据拷贝:每次调用 select 时,都需要将文件描述符集合从用户空间拷贝到内核空间,在文件描述符数量较多时,会带来一定的开销。

六、适用场景

由于 select 存在一些局限性,它适用于文件描述符数量较少、对性能要求不是特别高的场景,例如一些简单的网络服务器、嵌入式系统等。在实际应用中,若需要处理大量文件描述符或对性能有更高要求,可以考虑使用 pollepoll 等更高级的 I/O 复用机制。

通过深入理解 select 的原理、使用方法和优缺点,我们能够在网络编程中更好地运用这一技术,构建高效稳定的网络应用。

相关文章:

深入剖析 I/O 复用之 select 机制

深入剖析 I/O 复用之 select 机制 在网络编程中&#xff0c;I/O 复用是一项关键技术&#xff0c;它允许程序同时监控多个文件描述符的状态变化&#xff0c;从而高效地处理多个 I/O 操作。select 作为 I/O 复用的经典实现方式&#xff0c;在众多网络应用中扮演着重要角色。本文…...

Android开发报错解决

Android开发报错解决 组件相关文件相关权限相关代码相关程序报错IDE相关版本对应框架okhttp请求失败 Roomno such table cocos2d 组件相关 使用gravity属性让文字居中是&#xff0c;需把该属性放在text属性上面ScrollView只能容纳一个子视图 文件相关 放在drawble下的图片资源…...

Linux 网络命名空间:从内核资源管理到容器网络隔离

1. 网络命名空间是什么? 网络命名空间(Network Namespace) 是 Linux 内核提供的一种网络资源隔离机制,用于为进程或容器创建完全独立的网络环境。它并非物理或虚拟的网络接口(如网卡、veth pair 等),而是一个虚拟容器,包含以下资源的独立实例: 网络接口(物理或虚拟)…...

VNC windows连接ubuntu桌面

✅ 步骤 1&#xff1a;安装 VNC 服务器 首先&#xff0c;我们需要在 Winux 系统上安装一个 VNC 服务器。这里我们使用 tigervnc 作为例子&#xff0c;它是一个常用的 VNC 服务器软件。 打开终端并更新你的软件包&#xff1a; sudo apt update安装 tigervnc 服务器&#xff1a;…...

Elastic:如何构建由 AI 驱动的数字客户体验策略

作者&#xff1a;来自 Elastic Elastic Platform Team 客户通过多个数字渠道与企业和组织互动 —— 从网站和应用程序到聊天机器人和电子邮件。这些接触点构成了数字客户体验&#xff08;DCX&#xff09;。无缝的数字客户体验能显著提升客户满意度&#xff0c;进而带动更高的收…...

安防多协议接入/视频汇聚平台EasyCVR助力工地/工程/建筑施工领域搭建视频远程监控系统

一、摄像机安装方案​ 1&#xff09;安装位置选择​&#xff1a;摄像机安装需避开强振源与电磁干扰区&#xff0c;兼顾建筑外观&#xff0c;隐蔽安装。其防护罩应巧妙遮蔽视角&#xff0c;增强安防威慑。电梯轿厢内的摄像机&#xff0c;建议藏于吊顶。连接摄像机的视频、电源及…...

《100天精通Python——基础篇 2025 第16天:异常处理与调试机制详解》

目录 一、认识异常1.1 为什么要使用异常处理机制?1.2 语法错误1.3 异常错误1.4 如何解读错误信息 二、异常处理2.1 异常的捕获2.2 Python内置异常2.3 捕获多个异常2.4 raise语句与as子句2.5 使用traceback查看异常2.6 try…except…else语句2.7 try…except…finally语句--捕获…...

Ceph PG unfound/lost 问题排查与解决

Ceph PG unfound/lost 问题排查与解决 背景现象排查过程经验总结参考命令结语 背景 Ceph 集群出现 HEALTH_ERR&#xff0c;提示有 PG 对象丢失&#xff08;unfound&#xff09;&#xff0c;并且 repair 无法自动修复。 现象 ceph health detail 显示&#xff1a; HEALTH_ERR …...

LeetCode热题100--54.螺旋矩阵--中等

1. 题目 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 示例 2&#xff1a; 输入&#xff1a;ma…...

【嵌入式开发-CAN】

嵌入式开发-CAN ■ CAN简介 ■ CAN简介...

SQLite3介绍与常用语句汇总

SQLite3简介 SQLite3是一款轻量级的、基于文件的开源关系型数据库引擎&#xff0c;由 D. Richard Hipp 于 2000 年首次发布。它遵循 SQL 标准&#xff0c;但与传统的数据库系统不同&#xff0c;SQLite 并不运行在独立的服务器进程中&#xff0c;而是作为一个嵌入式数据库引擎直…...

uniapp中score-view中的文字无法换行问题。

项目场景&#xff1a; 今天遇到一个很恶心的问题&#xff0c;uniapp中的文字突然无法换行了。得..就介样 原因分析&#xff1a; 提示&#xff1a;经过一fan研究后发现 scroll-view为了能够横向滚动设置了white-space: nowrap; 强制不换行 解决起来最先想到的是&#xff0c;父…...

[学习]RTKLib详解:ephemeris.c与rinex.c

文章目录 RTKLib详解&#xff1a;ephemeris.c与rinex.cPART A: ephemeris.c一、代码整体作用与工作流程分析1.1 整体作用1.2 工作流程 二、核心函数说明2.1 alm2pos (Almanac to Position)2.2 eph2clk (Ephemeris to Clock)2.3 eph2pos (Ephemeris to Position)2.4 geph2pos (G…...

JDBC:java与数据库连接,Maven,MyBatis

JDBC 是使用Java语言操作关系型数据库的一套API JDBC是接口&#xff0c;用其实现一系列不同种类关系型数据库的实现类 JDBC本质: 官方(sun公司)定义的一套操作所有关系型数据库的规则&#xff0c;即接口 各个数据库厂商去实现这套接口&#xff0c;提供数据库驱动jar包 我…...

代码随想录第39天:单调栈

一、每日温度&#xff08;Leetcode 739&#xff09; 思路&#xff1a; 栈里存放的是**“还没等到升温的日子”**的索引&#xff1b; 每遇到一个新的温度&#xff1a; 检查是否比栈顶的温度高&#xff1b; 如果高了&#xff0c;说明升温来了&#xff0c;栈顶元素可以出栈&…...

如何在vite构建的vue项目中从0到1配置postcss-pxtorem

1. 安装postcss-pxtorem和autoprefixer yarn add postcss-pxtorem autoprefixer2. 在vite.config.ts中写入 import { defineConfig } from "vite"; import vue from "vitejs/plugin-vue"; import postcssPxtorem from "postcss-pxtorem"; impo…...

基于51单片机的自动洗衣机衣料材质proteus仿真

地址&#xff1a;https://pan.baidu.com/s/13d2bJ6vKh8ZLuDBZnI0VGw 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C51 是一款常用的 8 位单片机&#xff0c;由 Atmel 公司&#xff08;现已被 Microchip 收…...

永久免费的小工具,内嵌微软接口

有时候我们制作短视频&#xff0c;需要为视频添加声音&#xff0c;但部分配音软件要收费。不过别担心&#xff0c;今天给大家推荐一款超实用的免费文字转语音软件&#xff0c;完全无需担忧费用问题&#xff01; 01 软件介绍 这款软件就是Read Aloud&#xff0c;具有以下特点&a…...

C++漫步结构与平衡的殿堂:AVL树

文章目录 1.AVL树的概念2.AVL树的结构3.AVL树的插入4.AVL树的旋转4.1 左单旋4.2 右单旋4.3 右左双旋4.4 左右双旋 5.AVL树的删除6.AVL树的高度7.AVL树的平衡判断希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 二叉搜索树有其自身的缺陷&#xf…...

MIST:一键解锁 macOS 历史版本,旧系统安装不再难!

在 Mac 电脑的使用过程中&#xff0c;你是否遇到过这些困扰&#xff1f;为了运行一款经典设计软件&#xff0c;新系统却无法兼容&#xff1b;或是想给老旧 Mac 设备升级&#xff0c;却找不到适配的系统版本。而 App Store 里&#xff0c;旧版 macOS 安装包就像 “隐藏副本”&am…...

mac连接lniux服务器教学笔记

从你的检查结果看&#xff0c;容器内已经安装了 XFCE 桌面环境&#xff08;xfce.desktop 和 xubuntu.desktop 的存在说明桌面环境已存在&#xff09;。以下是针对 Docker 容器环境的远程桌面配置方案&#xff1a; 一、容器内快速配置远程桌面&#xff08;XFCE VNC&#xff09;…...

网站公安备案流程及审核时间

在中国&#xff0c;网站运营除了需要 ICP备案&#xff08;工信部备案&#xff09;&#xff0c;还需完成 公安备案&#xff08;公安机关互联网站安全备案&#xff09;。以下是详细流程及审核时间说明&#xff1a; 一、公安备案流程 1. 备案对象 所有在中国境内运营的网站&#…...

python学生作业提交管理系统-在线作业提交系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…...

从颜料混色到网络安全:DH算法的跨界智慧

一、颜料混色的秘密 想象一下&#xff0c;你和朋友各自有一罐私密的颜料&#xff0c;但你们想共同调出一种只有彼此知道的新颜色&#xff0c;而旁观者即使看到你们的操作也无法复现。奇怪的是&#xff0c;你们全程没有直接交换颜料&#xff0c;却能达成共识——这就是**迪菲-赫…...

初学者的AI智能体课程:构建AI智能体的十堂课

初学者的AI智能体课程:构建AI智能体的十堂课 在人工智能(AI)领域,AI智能体正在逐渐发挥其不容忽视的作用。自动化的智能体不仅仅在理论上广泛讨论,更加在实际应用中开辟了一片新的天地。那么如何动手开发属于自己的AI智能体呢?Microsoft提供的AI智能体入门课正是为此而设…...

数据结构 - 8( AVL 树和红黑树 10000 字详解 )

一&#xff1a;二叉搜索树 1.1 回顾二叉搜索树 我们在树的章节中学习了二叉搜索树的概念。二叉搜索树满足以下性质&#xff1a;如果它的左子树存在&#xff0c;则左子树所有节点的值均小于根节点的值&#xff1b;如果右子树存在&#xff0c;则右子树所有节点的值均大于根节点…...

Tcp 通信简单demo思路

Server 端 -------------------------- 初始化部分 ------------------------------- 1.创建监听套接字&#xff1a; 使用socket(协议家族&#xff0c;套接字的类型&#xff0c;0) 套接字类型有 SOCK_STREAM&#xff1a;表示面向连接的套接字&#xff08;Tcp协议&#xff09;&…...

Cesium 导航控件(指南针 + 缩放按钮),自定义放置位置

Cesium 导航控件&#xff08;指南针 缩放按钮&#xff09; Cesium 导航控件&#xff08;指南针 缩放按钮&#xff09;的功能实现&#xff0c;从技术角度来看&#xff0c;可以整理出一整套实现流程和技术结构。这套流程结合了以下几个核心技术点&#xff1a; 1、整体功能目标 …...

MySQL的索引和事务

目录 1、索引 1.1 查看索引 1.2 创建索引 1.3 删除索引 1.4 索引的实现 2、事务 1、索引 索引等同于目录&#xff0c;属于针对查询操作的一个优化手段&#xff0c;可以通过索引来加快查询的速度&#xff0c;避免针对表进行遍历。 主键、unique和外键都是会自动生成索引的…...

【Fifty Project - D25】

今日完成记录 TimePlan完成情况9&#xff1a;00 - 11&#xff1a;30大论文修改修改情况书小论文修改√16&#xff1a;00 - 17 &#xff1a;00Leetcode√ Leetcode 每日一题 到达最后一个房间的最小时间II&#xff1a;和昨天的每日一题大致一样&#xff0c;增加一个条件&…...

pip下载tmp不够

问题描述 今天遇到一个小问题&#xff0c;在用pip安装的时候提示 ERROR: Could not install packages due to an OSError: [Errno 28] No space left on device 但我们单位用于生产环境的机器磁盘都是基本是论TB的&#xff0c;怎么会不够呢&#xff1f; 原因分析&#xff1a;…...

一种机载扫描雷达实时超分辨成像方法——论文阅读

一种机载扫描雷达实时超分辨成像方法 1. 专利的研究目标与产业意义1.1 研究目标与实际问题1.2 产业意义2. 专利的创新方法:滑窗递归优化与实时更新2.1 核心模型与公式2.2 与传统方法对比优势3. 实验设计与验证3.1 仿真参数3.2 实验结果4. 未来研究方向与挑战4.1 学术挑战4.2 技…...

nginx 会话保持(cookie的配置)

nginx会话保持主要有以下几种实现方式。 1. ip_hash ip_hash使用源地址哈希算法,将同一客户端的请求总是发往同一个后端服务器,除非该服务器不可用。 ip_hash语法: upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; …...

nginx 实现动静分离

环境 : 三个机器,准备一个nginx代理 两个http 分别处理动态和静态 知识点--expires expires功能说明---(为客户端配置缓存时间) nginx缓存的设置可以提高网站性能,对于网站的图片,尤其是新闻网站,图片一旦发布,改动的可能是非常小的,为了减小对服务器请求的压力,提高…...

k8s的pod挂载共享内存

k8s的pod挂载共享内存&#xff0c;限制不生效问题&#xff1a; 注&#xff1a;/dev/shm 是 Linux 系统中用于共享内存的特殊路径。通过将 emptyDir 的 medium 设置为 Memory&#xff0c;可以确保 /dev/shm 正确地挂载到一个基于内存的文件系统&#xff0c;从而实现高效的共享内…...

Java高频面试之并发编程-14

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天又来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;指令重排有限制没有&#xff1f;happens-before 又是什么&#xff1f; 在并发编程中&#xff0c;指令重排&#xff08;…...

Linux基础(最常用基本命令)

1.查看文件ls 1.1 格式 ls 选项 参数&#xff0c;如&#xff1a;ls -lah ~/ 1.2 选项设置&#xff1a; -l&#xff1a;list 以列表方式显示文件 -h&#xff1a;human-readable 以人类可读的方式显示文件大小(会将纯数字转换为kb&#xff0c;mb) -a&#xff1a;all 显示所有的…...

【Python 日期和时间】

Python 中处理日期和时间主要依赖 datetime 模块&#xff0c;结合 dateutil 和 pytz 等第三方库可实现更复杂的需求。以下是日期和时间处理的核心知识点&#xff1a; 一、基础模块 1. datetime 模块 核心类&#xff1a;datetime, date, time, timedelta安装依赖&#xff1a;p…...

C#简易Modbus从站仿真器

C#使用NModbus库&#xff0c;编写从站仿真器&#xff0c;支持Modbus TCP访问&#xff0c;支持多个从站地址和动态启用/停用从站&#xff08;模拟离线&#xff09;&#xff0c;支持数据变化&#xff0c;可以很方便实现&#xff0c;最终效果如图所示。 项目采用.net framework 4.…...

FPGA图像处理(四)------ 图像裁剪

timescale 1ns / 1ps // // Description: 图像裁剪算法 // module image_crop(input wire clk,input wire reset,input wire [10:0] img_width,input wire [10:0] img_height,input wire [10:0] img_x_start,input wire [10:0] img_x_end,input wire [10:0] img_y_start,input…...

1.MySQL数据库初体验

1.1数据库简介 1.1.1使用数据库的必要性 使用数据库可以高效且条理分明地存储数据&#xff0c;使人们能够更加迅速、方便地管理数据。 数据库特点&#xff1a; a.可以结构化存储大量地数据信息&#xff0c;方便用户进行有效的检索 b.可以有效地保持数据信息的一致性、完整…...

量子密码的轻量级通信协议笔记

代码笔记 本文档提供了项目代码的详细说明&#xff0c;包括代码结构、关键算法实现和重要的代码片段。 代码结构 . ├── Makefile # 构建系统配置 ├── coap_client.c # CoAP客户端实现 ├── coap_server.c # CoAP服务端实现 ├─…...

探索 C++ 在行业应用与技术融合中的核心价值

引言 在科技飞速发展的今天&#xff0c;C 作为一门兼具高性能与灵活性的编程语言&#xff0c;正深度融入游戏开发、人工智能、区块链等多个关键领域。其高效的内存管理、底层控制能力以及对现代硬件架构的深度优化&#xff0c;使其成为复杂系统开发的首选语言。本文将深入探讨…...

雷赛伺服电机

ACM0经济 编码器17位&#xff1a; ACM1基本 编码器23位磁编&#xff0c; ACM2通用 编码器24位光电&#xff0c; 插头定义&#xff1a;...

word文档基本操作: 编辑页眉页脚和插入目录

文章目录 引言I 编辑页眉页脚II 插入目录III 知识扩展基于axure画架构图基于Knife4j导出接口文档基于PDManer导出数据库设计文档引言 背景: 信息安全认证需要准备相关文件用于审核 一般的开发设计包含总体设计、概要设计、详细设计、接口设计、数据库设计、部署结构设计、原型…...

数据结构(二)——线性表的链式表示和实现

一、单链表 1.单链表的定义 如图所示每个节点包含两个域:数据域和指针域。数据域存储数据元素&#xff0c;指针域存储下一个节点的地址&#xff0c;因此指针指向的类型也是节点类型。每个指针都指向下一个节点&#xff0c;都是朝一个方向的&#xff0c;这样的链表称为单向链表…...

HTML10:iframe内联框架

iframe内部框架 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>内联框架学习</title> </head> <body> <!--iframe内联框架 src:地址 width-height:高度宽度 --> <iframe…...

C++代码随想录刷题知识分享-----数组交集—LeetCode 349

1  题目描述 给定两个整型数组 nums1 和 nums2&#xff0c;请返回它们的交集。 交集中 每个元素必须是唯一的。输出结果的顺序可以任意。 示例输入输出说明1nums1 [1,2,2,1], nums2 [2,2][2]2 只出现一次2nums1 [4,9,5], nums2 [9,4,9,8,4][4,9] 或 [9,4]顺序不作要求…...

Wireshark基本使用

本文会对Wireshark做简单介绍&#xff0c;带大家熟悉一下Wireshark的界面&#xff0c;以及如何使用过滤器。 接着会带大家查看TCP五层模型下&#xff0c;带大家回顾各层首部的格式。 最后会演示 Wireshark 如何抓取三次握手和四次挥手包的过程。 目录 一.Wireshark简介 二…...

学习c语言的链表的概念、操作(另一篇链表的笔记在其他的栏目先看这个)

在学习Linux之间我们先插入一下链表的知识 学习链表&#xff08;一种数据结构思想&#xff09; 链表和数组的区别和实现&#xff1a; 链表&#xff08;链表是个好东西&#xff09; 链表概念&#xff08;什么是链表&#xff09;&#xff1f; 链表就是数据结构->数据的存储…...