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

C++.IP协议通信

C++IP协议通信

  • 1. TCP协议通信
    • 1.1 服务端实现
      • 创建套接字
      • 绑定地址
      • 监听连接
      • 接受连接
      • 数据传输
      • 关闭连接
    • 1.2 客户端实现
      • 创建套接字
      • 连接服务器
      • 数据传输
      • 关闭连接
    • 1.3 示例代码
      • 服务端代码示例
      • 客户端代码示例
      • 绑定地址
      • 接收数据
      • 发送数据
      • 关闭套接字
    • 2.2 客户端实现
      • 创建套接字
      • 发送数据
      • 接收数据
      • 关闭套接字
    • 2.3 示例代码
      • 服务端代码示例
      • 客户端代码示例
      • 发送POST请求
      • 示例代码说明
    • 4.1 基本原理
    • 4.2 示例代码
      • FTP文件下载
      • FTP文件上传
      • 示例代码说明
    • 5.1 基本原理
    • 5.2 示例代码
      • 发送邮件示例代码
      • 示例代码说明
    • 6.1 基本原理
    • 6.2 示例代码
      • 连接POP3服务器并登录
      • 检索邮件列表
      • 下载邮件内容
      • 示例代码说明
    • 7.1 介绍了TCP和UDP协议的基本通信流程和示例代码
    • 7.2 介绍了HTTP、FTP、SMTP和POP3等应用层协议的原理和C++实现方法
    • 7.3 强调了协议在通信中的重要性以及C++在网络编程中的应用

1. TCP协议通信

1.1 服务端实现

创建套接字

使用socket(AF_INET, SOCK_STREAM, 0)创建TCP套接字。其中,AF_INET表示使用IPv4协议族,SOCK_STREAM表示使用TCP协议,0表示让系统自动选择默认的协议。

int listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (listenfd == -1) {perror("socket creation failed");exit(EXIT_FAILURE);
}

绑定地址

通过bind将套接字绑定到本地地址和端口。绑定时需要指定本地的IP地址和端口号,通常使用INADDR_ANY表示绑定到所有可用的网络接口。

struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(8080);if (bind(listenfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {perror("bind failed");exit(EXIT_FAILURE);
}

监听连接

调用listen函数开始监听客户端连接请求。listen函数的第二个参数backlog表示等待连接的队列长度,通常设置为SOMAXCONN

if (listen(listenfd, SOMAXCONN) == -1) {perror("listen failed");exit(EXIT_FAILURE);
}

接受连接

使用accept函数接受客户端连接,返回新的套接字用于通信。accept函数会阻塞,直到有客户端连接请求到达。

struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
int clientfd = accept(listenfd, (struct sockaddr*)&client_addr, &client_len);
if (clientfd == -1) {perror("accept failed");exit(EXIT_FAILURE);
}

数据传输

通过sendrecv函数与客户端进行数据交互。send函数用于向客户端发送数据,recv函数用于从客户端接收数据。

char buffer[1024];
memset(buffer, 0, sizeof(buffer));
int bytes_received = recv(clientfd, buffer, sizeof(buffer), 0);
if (bytes_received > 0) {printf("Received data: %s\n", buffer);send(clientfd, buffer, bytes_received, 0);
} else {perror("recv failed");
}

关闭连接

通信结束后调用close关闭套接字。

close(clientfd);
close(listenfd);

1.2 客户端实现

创建套接字

使用socket(AF_INET, SOCK_STREAM, 0)创建TCP套接字。

int clientfd = socket(AF_INET, SOCK_STREAM, 0);
if (clientfd == -1) {perror("socket creation failed");exit(EXIT_FAILURE);
}

连接服务器

通过connect函数向服务器发起连接请求。需要指定服务器的IP地址和端口号。

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("127.0.0.1");if (connect(clientfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {perror("connect failed");exit(EXIT_FAILURE);
}

数据传输

使用sendrecv函数与服务器进行数据交互。

char send_buffer[] = "Hello, Server!";
send(clientfd, send_buffer, strlen(send_buffer), 0);char recv_buffer[1024];
memset(recv_buffer, 0, sizeof(recv_buffer));
int bytes_received = recv(clientfd, recv_buffer, sizeof(recv_buffer), 0);
if (bytes_received > 0) {printf("Received data: %s\n", recv_buffer);
} else {perror("recv failed");
}

关闭连接

通信结束后调用close关闭套接字。

close(clientfd);

1.3 示例代码

服务端代码示例

#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>using namespace std;int main() {int listenfd = socket(AF_INET, SOCK_STREAM, 0);if (listenfd == -1) {perror("socket creation failed");exit(EXIT_FAILURE);}struct sockaddr_in server_addr;memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htonl(INADDR_ANY);server_addr.sin_port = htons(8080);if (bind(listenfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {perror("bind failed");exit(EXIT_FAILURE);}if (listen(listenfd, SOMAXCONN) == -1) {perror("listen failed");exit(EXIT_FAILURE);}struct sockaddr_in client_addr;socklen_t client_len = sizeof(client_addr);int clientfd = accept(listenfd, (struct sockaddr*)&client_addr, &client_len);if (clientfd == -1) {perror("accept failed");exit(EXIT_FAILURE);}char buffer[1024];memset(buffer, 0, sizeof(buffer));int bytes_received = recv(clientfd, buffer, sizeof(buffer), 0);if (bytes_received > 0) {printf("Received data: %s\n", buffer);send(clientfd, buffer, bytes_received, 0);} else {perror("recv failed");}close(clientfd);close(listenfd);return 0;
}

客户端代码示例

#include <iostream>

相关文章:

C++.IP协议通信

C++IP协议通信 1. TCP协议通信1.1 服务端实现创建套接字绑定地址监听连接接受连接数据传输关闭连接1.2 客户端实现创建套接字连接服务器数据传输关闭连接1.3 示例代码服务端代码示例客户端代码示例绑定地址接收数据发送数据关闭套接字2.2 客户端实现创建套接字发送数据接收数据…...

虚幻引擎5-Unreal Engine笔记之UE编辑器退出时的保存弹框

虚幻引擎5-Unreal Engine笔记之UE编辑器退出时的保存弹框 code review! 文章目录 虚幻引擎5-Unreal Engine笔记之UE编辑器退出时的保存弹框1. 退出编辑器时弹出的“Save Content”窗口2. File 菜单中的保存选项3. 区别总结 1. 退出编辑器时弹出的“Save Content”窗口 退出时…...

【KEIL】更新AC6编译器

看过部分的文章&#xff0c;Arm Compiler 6&#xff08;AC6&#xff09;编译器&#xff0c;相比AC5在编译速度和代码优化上提升了。因此&#xff0c;笔者决定升级到AC6的最新版本。可以更新keil5到最新版本&#xff0c;上面集成AC6编译器的版本&#xff0c;与最新版相差不远。假…...

Mosquitto MQTT库实战指南

目录 1. MQTT协议简介2. Mosquitto概述3. 开源MQTT实现对比4. 为什么选择Mosquitto5. Mosquitto的交叉编译6. MQTT发布订阅实战7. 进阶应用与最佳实践8. 总结 1. MQTT协议简介 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种基于发布/订阅模式的轻…...

C语音学习---函数指针

目录 1. 函数指针解析 2. 自定义实现&#xff08;函数指针赋值&#xff09; 利用下面一段例子来解析&#xff1a; int (*set_slave)(modbus_t *ctx, int slave); 1. 函数指针解析 set_slave 是一个 函数指针&#xff0c;指向一个函数。 该函数接受两个参数&#xff1a; mo…...

04.three官方示例+编辑器+AI快速学习webgl_animation_skinning_additive_blending

本实例主要讲解内容 这个示例展示了Three.js中**骨骼动画的叠加混合(Additive Animation Blending)**技术。通过加载一个机器人模型&#xff0c;演示了如何在基础动画(如站立、行走、跑步)之上叠加额外的动画效果(如潜行姿态、悲伤表情、点头同意等)&#xff0c;实现更丰富的角…...

WSL配置docker启动nacos容器load derby-schema.sql error.问题解决方案

nacos配置问题 问题再现查看错误logsQWEN的解答不挂载/data结论 问题再现 本来想要本地跑一下nacos,之前都是直接在Linux环境下面&#xff0c;现在就使用windows的wsl跑一下nacos,之前是需要先配置/conf文件下面的porperties文件以及构建对应的nacos-config数据库。所以我使用…...

游戏引擎学习第272天:显式移动转换

回顾并为今天的内容铺垫背景 我们刚开始为游戏主角编写一些程序逻辑&#xff0c;因为我们之前已经完成了大部分引擎方面的开发&#xff0c;现在可以专注在角色身上。这个角色的移动方式会有些特别&#xff0c;与大多数游戏角色的运动机制不太一样。我们当前正在实现的控制方式…...

AVL树解析

插入操作 // 插入操作 bool insert(const pair<K, V>& kv) {// 若树为空&#xff0c;直接构造&#xff0c;new一个if (_root nullptr) {_root new Node(kv);return true;}// 用于遍历树的当前节点Node* cur _root;// 用于记录当前节点的父节点Node* parent n…...

vue 中的数据代理

在 Vue 中&#xff0c;数据代理&#xff08;Data Proxy&#xff09; 是 Vue 实现 MVVM 模式 的关键技术之一。Vue 使用数据代理让你可以通过 this.message 访问 data.message&#xff0c;而不需要写 this.data.message —— 这大大简化了模板和逻辑代码。 我们来深入理解它的本…...

Linux共享内存深度解析:从内核机制到云原生应用

引言&#xff1a;超越进程边界的内存魔术 在Linux系统的进程间通信&#xff08;IPC&#xff09;领域&#xff0c;共享内存&#xff08;Shared Memory&#xff09;如同魔法镜子般的存在——不同进程透过它看到相同的内存镜像。这种机制摒弃了数据拷贝&#xff0c;直击性能瓶颈&…...

Vue Router全局拦截

Vue Router全局拦截全攻略 一、为什么需要全局拦截&#xff1f; 最近在开发后台管理系统时&#xff0c;突然发现所有页面都需要登录才能访问。如果每个页面都手动检查登录状态&#xff0c;那代码简直要写成意大利面条了。这时候&#xff0c;Vue Router的全局拦截功能就像个贴…...

从0开始学linux韦东山教程第三章问题小结(3)

本人从0开始学习linux&#xff0c;使用的是韦东山的教程&#xff0c;在跟着课程学习的情况下的所遇到的问题的总结,理论虽枯燥但是是基础。说实在的越看视频越感觉他讲的有点乱后续将以他的新版PDF手册为中心&#xff0c;视频作为辅助理解的工具。参考手册为嵌入式Linux应用开发…...

【前端】【css】【总复习】三万字详解CSS 知识体系

🌈 CSS 知识体系目录大纲 一、基础知识入门 1. CSS 简介与作用 CSS(Cascading Style Sheets,层叠样式表)是一种用于给 HTML 页面添加样式的语言,作用是让网页更美观、结构更清晰、布局更灵活。 核心作用: 控制网页元素的 颜色、字体、间距、边框、背景布局网页元素位置…...

Linux 进程等待

1、进程等待 僵尸进程 是一个比较麻烦的问题&#xff0c;如果不对其做出处理&#xff0c;僵尸进程 就会越来越多&#xff0c;导致 内存泄漏 和 标识符 占用问题 进程一旦变成僵尸状态&#xff0c;那就刀枪不入&#xff0c;“杀人不眨眼”的kill -9 也无能为力&#xff0c;因为…...

轻量服务器与宝塔

因为访问宝塔面板是需要在安全组设置一下开放端口&#xff0c;比如这里是42450 但是我们用的轻量服务器是把安全组这种功能削减了的&#xff0c;所以我就去尝试修改了一下防火墙设置 然后就可以访问了...

深入理解AMBA总线(六)AHB-lite Slave响应和其它控制信号

上一篇文章给大家介绍了AHB-lite的一些控制信号&#xff0c;重点是通过这些控制信号去理解AHB-lite为什么这么设计&#xff0c;采用这些控制信号有什么好处。这节课给大家带来剩余的一些控制信号介绍。 ** 1、Slave Response Signaling ** 1.1、Slave Transfer Responses …...

app加固

1、什么是加固? 我们之前讲的逆向,大多数都是用加密算法去加密一些明文字符串,然后把得到的结果用 Base64、Hex等进行编码后提交。加固其实也一样&#xff0c;只不过他通常加密的是 dex文件而已。但是 dex 文件加密以后&#xff0c;安卓系统是没法直接运行的。所以加固的核心&…...

Linux架构篇、第三章_2_Linux服务器监控与NGINX优化

Linux_架构篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a; 版本号: 1.0,0 作者: 老王要学习 日期: 2025.05.11 适用环境: Centos7 文档说明 本文围绕 Linux 服务器监控与 NGINX 优化展开。介绍了 sysst…...

第26节:卷积神经网络(CNN)-数据增强技术(PyTorch)

1. 引言 在深度学习领域,数据增强(Data Augmentation)是提升卷积神经网络(CNN)性能的关键技术之一。通过人为地扩展训练数据集,数据增强能够有效提高模型的泛化能力,防止过拟合,特别是在训练数据有限的情况下。本文将全面介绍PyTorch框架下的数据增强技术,包括基本原理、…...

架构思维:通用架构模式_怀疑下游的设计思路与最佳实践

文章目录 1. 引言2. 为什么要“怀疑下游”3. 三大类下游依赖及应对方案3.1 对其他微服务的依赖3.1.1 分布式事务简易补偿方案3.2 对数据库的依赖3.3 对消息中间件的依赖 4. 分布式事务实战案例5. 小结 1. 引言 在 架构思维&#xff1a;通用架构模式_从设计到代码构建稳如磐石的…...

[Java实战]Spring Boot 中Starter机制与自定义Starter实战(九)

[Java实战]Spring Boot 中Starter机制与自定义Starter实战&#xff08;九&#xff09; 引言 Spring Boot 的 Starter 是其“约定优于配置”理念的核心体现&#xff0c;通过简化依赖管理和自动配置&#xff0c;极大提升了开发效率。本文将深入剖析 Starter 的设计思想、实现原…...

C++23 views::repeat (P2474R2) 深入解析

文章目录 引言C20 Ranges库回顾什么是Rangesstd::views的作用 views::repeat概述基本概念原型定义工作原理应用场景初始化容器模拟测试数据 总结 引言 在C的发展历程中&#xff0c;每一个新版本都会带来一系列令人期待的新特性&#xff0c;这些特性不仅提升了语言的性能和表达…...

【第三十五周】Janus-pro 技术报告阅读笔记

Janus-Pro 摘要Abstract文章信息引言方法Janus 架构Janus 训练Janus-Pro 的改进 实验结果总结 摘要 本篇博客介绍了Janus-Pro&#xff0c;这是一个突破性的多模态理解与生成统一模型&#xff0c;其核心思想是通过解耦双路径视觉编码架构解决传统方法中语义理解与像素生成的任务…...

基于Qt的app开发第七天

写在前面 笔者是大一下计科生&#xff0c;标题这个项目是笔者这个学期的课设&#xff0c;与学长共创&#xff0c;我负责客户端部分&#xff0c;现在已经实现了待办板块的新建、修改。 这个项目目前已经走上正轨了&#xff0c;博主也实现了主要功能的从无到有&#xff…...

第二十二节:图像金字塔-拉普拉斯金字塔

在数字图像处理的奇幻世界中,存在着一种能够连接不同视觉维度的神秘阶梯——图像金字塔。这种独特的结构让计算机视觉算法能够在不同尺度下观察和理解图像特征,而其中的拉普拉斯金字塔更是隐藏着图像细节重构的终极奥秘。 一、金字塔的数学基础:从高斯到拉普拉斯 1.1 高斯金…...

Flutter基础()

导航栏 appBar: AppBar() title: const Text(搜索) //标题 backgroundColor: Colors.blue //背景颜色 centerTitle: true //标题居中leading 属性 作用&#xff1a; 放置在应用栏左侧的控件&#xff0c;通常是一个图标按钮&#xff0c;用于导航或打开菜单。 AppBar(le…...

ES面试题系列「一」

1、Elasticsearch 是什么&#xff1f;它与传统数据库有什么区别&#xff1f; 答案&#xff1a;Elasticsearch 是一个基于 Lucene 的分布式、开源的搜索和分析引擎&#xff0c;主要用于处理大量的文本数据&#xff0c;提供快速的搜索和分析功能。与传统数据库相比&#xff0c;E…...

Oracle 通过 ROWID 批量更新表

Oracle 通过 ROWID 批量更新表 在 Oracle 数据库中&#xff0c;使用 ROWID 进行批量更新是一种高效的更新方法&#xff0c;因为它直接定位到物理行位置&#xff0c;避免了通过索引查找的开销。 ROWID 基本概念 ROWID 是 Oracle 数据库中每一行的唯一物理地址标识符&#xff…...

罗技无线鼠标的配对方法

罗技鼠标的配对方法&#xff1a; 重新连接鼠标 请按照以下步骤将鼠标与 USB 接收器重新配对。 1.将USB接收器插入计算机。 2.将鼠标关闭电源。 3.按住并持续按住向右按钮&#xff0c;直到操作结束。 4.切换鼠标电源。 5. 单击一次左侧按钮。 6. 单击一次中间按钮。 7.全部松开&…...

移动应用开发的六大设计原则

在移动应用开发中&#xff0c;遵循设计原则能大幅提升代码的可维护性和扩展性。本文以一个简单的学生管理系统为例&#xff0c;解析六大核心设计原则的实践方法。 1. 单一职责原则 优点&#xff1a; 提高可维护性&#xff1a;一个类只负责一项职责&#xff0c;代码的功能会更…...

LLM初识

从零到一&#xff1a;用 Python 和 LLM 构建你的专属本地知识库问答机器人 摘要&#xff1a; 随着大型语言模型&#xff08;LLM&#xff09;的兴起&#xff0c;构建智能问答系统变得前所未有的简单。本文将详细介绍如何使用 Python&#xff0c;结合开源的 LLM 和向量数据库技…...

【CTF】Linux Shell RCE绕过(bypass)技术总结

在Linux环境下&#xff0c;远程代码执行&#xff08;RCE&#xff0c;Remote Code Execution&#xff09;是一种常见的攻击手段。然而&#xff0c;许多系统会对命令注入进行过滤或限制&#xff0c;例如禁止特定关键字&#xff08;如system&#xff09;、斜杠&#xff08;/&#…...

深入理解 Linux 权限控制机制

引言 在 Linux 系统中&#xff0c;权限控制是保障系统安全的核心机制。通过限制用户对文件和资源的访问&#xff0c;它能有效防止未授权操作&#xff0c;保护数据不被篡改或泄露。合理设置权限不仅有助于实现用户隔离和最小权限原则&#xff0c;还能降低系统被滥用或攻击的风险…...

技术书籍推荐(002)

20. 利用Python进行数据分析 免费 电子书 PDF 下载 书籍简介&#xff1a; 本书聚焦于使用Python进行数据处理和分析。详细介绍了Python中用于数据分析的重要库&#xff0c;如NumPy&#xff08;提供高效的数值计算功能&#xff0c;包括数组操作、数学函数等&#xff09;、panda…...

[SAP] SAP ERP用户参数设置

菜单路径 个人默认值的设置(数值&#xff0c;日期&#xff0c;时间) 个人参数值的设置 在给参数设置参数值后&#xff0c;当用户登录到对应功能页面时&#xff0c;这些参数值就会自动带出来 例如&#xff0c;我们分别对上述AAT&#xff0c;VKO以及VTW这3个参数设置了参数值&am…...

Python中,async和with结合使用,有什么好处?

在Python的异步编程中&#xff0c;async和with的结合使用&#xff08;即async with&#xff09;为开发者提供了一种优雅且高效的资源管理模式。这种组合不仅简化了异步代码的编写&#xff0c;还显著提升了程序的健壮性和可维护性。以下是其核心优势及典型应用场景的分析&#x…...

【信息系统项目管理师】第3章:信息系统治理 - 29个经典题目及详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第…...

python实战项目69:基于Python爬虫的链家二手房数据采集方法研究

python实战项目69:链家二手房数据采集 一、项目需求1.1 房地产数据价值1.2 传统数据获取局限性1.3 技术可行性二、数据采集流程2.1 需求分析2.2 网页结构分析2.3 请求发送与反爬策略2.4 数据解析2.5 数据存储三、结论与展望四、完整代码一、项目需求 本文针对房地产数据分析需…...

PowerShell 脚本中文乱码处理

问题描述 脚本带中文&#xff0c;执行时命令行窗口会显示出乱码 示例 Write-Host "测试成功&#xff01;"解决方法 问了DeepSeek&#xff0c;让确认是不是 UTF8 无 BOM 格式 事实证明方向对了 但是确认信息有偏差 改成 UTF8 with BOM 使用任意支持修改编码的文本…...

SpEL(Spring Expression Language)使用详解

SpEL&#xff08;Spring Expression Language&#xff09;是 Spring 框架中一种强大的表达式语言&#xff0c;支持在运行时动态查询和操作对象图。它与 Spring 生态深度集成&#xff0c;广泛应用于依赖注入、数据绑定、AOP、安全规则等场景。以下是其核心语法、应用场景及使用示…...

论文阅读与写作:《从探索到突破:解密科研和论文写作的思维密码》

文章目录 一、如何做科研1.科研的步骤2.课题选择3.快速入门一个新领域&#xff1a;读论文&#xff0c;先读综述(1)自己看论文的时候&#xff0c;每篇论文花3-5分钟记录一下自己的idea和一些瞬间的想法(2)高质量文献&#xff1a;顶会顶刊(3)如何检索 4.注重团队协作与学术交流5.…...

免费公共DNS服务器推荐

当自动获取的DNS或本地运营商的DNS出现问题&#xff0c;可能导致软件无法连接服务器。此时&#xff0c;手动修改电脑的DNS设置或许能解决问题。许多用户觉得电脑上网速度慢、游戏卡顿&#xff0c;归咎于DNS问题。确实&#xff0c;我们可以自行设置一个DNS来改善网络体验。不少用…...

CK-S650-PA60S半导体专用读写器|读写头与绿联RS232串口转接头联机测试说明

CK-S650-PA60S半导体专用读写器|读写头是一款国产替代欧姆龙V640系列&#xff0c;支持德州仪器公司(TI)制造的RI-TRP-DR2B、RI-TRP-WR2B-40低频玻璃管标签|射频标签读写&#xff0c;广泛应用半导体硅片盒、晶圆盒、花篮等RFID插件识别与产品追溯领域。 CK-S650-PA60S半导体专用…...

Babel 基础使用指南:从安装到编译的完整流程

Babel 是当今前端开发中不可或缺的工具&#xff0c;它允许开发者使用最新的 JavaScript 特性&#xff0c;同时确保代码能在各种浏览器和环境中运行。本文将带你从零开始学习 Babel 的基础使用&#xff0c;涵盖安装、配置到实际编译的全过程。 1. 安装 Babel 和插件 首先&…...

uniapp-商城-52-后台 商家信息(商家信息数据,云对象使用)

1、概述 已经通过好几个篇幅来说明商家信息&#xff0c;包括logo、商家名称&#xff0c;地址&#xff0c;电话以及商家简介。通过表单组件和标签&#xff0c;以及我们的文件上传标签&#xff0c;都做了说明。&#xff08;logo上传&#xff0c;用的文件上传组件是上传到公共的数…...

【我的创作纪念日】512

机缘 还记得 2023 年 12 月 15 日&#xff0c;我撰写了第 1 篇技术博客&#xff1a;《oracle 跟踪文件--审计日志》。从此&#xff0c;这平凡的一天&#xff0c;赋予了我不平凡的意义。在那一刻&#xff0c;我已在创作这趟旅程中出发&#xff0c;并立志将工作中的经验总结&…...

共享内存与信号量结合

在Linux系统中&#xff0c;进程间通信&#xff08;IPC&#xff09;和原子性是并发编程中的核心问题。以下是对这些概念的详细分步解释&#xff1a; 一、进程间通信&#xff08;IPC&#xff09;方法 1. 管道&#xff08;Pipe&#xff09; 匿名管道&#xff1a;用于父子进程等有…...

西门子PLC s7-1200工艺对象“轴”的应用(1)

1. 工艺对象 “ 轴 ” 的概念 在西门子 S7-1200 PLC 中&#xff0c;术语 “ 轴 ” 特指用 “ 轴 ” 工艺对象表示的驱动器工艺映像。 “ 轴 ” 工艺对象是用 户程序与驱动器之间的接口&#xff0c;用于接收用户程序中的运动控制命令、执行这些命令并监视其运行情况。 运动控制…...

ubuntu22.04在 Docker容器中安装 ROS2-Humble

22.04 安装 docker 容器并实现rviz功能 1 docker pull命令拉取包含ROS-Humble的镜像&#xff1a; docker pull osrf/ros:humble-desktop-full-jammy docker images验证该镜像是否拉取成功。 使用镜像osrf/ros:humble-desktop-full-jammy创建并运行容器 sudo docker run -it…...