QT-C++ 西门子snap7通讯库接口

QT-C++ 西门子snap7通讯库接口

  • 一、核心程序
    • 1.头文件
    • 2.源文件
  • 二、下载连接

一、核心程序

1.头文件

#pragma once
#include <QObject>
#include <QMutex>
#include <QThread>
#include "ToolSnapGlobal.h"
#include "snap7.h"
/*
特别说明:
西门子PLC使用是大端的数据格式,PC端用是小端数据格式i,需要转换
*/
struct sSnapData;
class TOOL_SNAP_EXPORT cSnapConObject : public QThread
{Q_OBJECTpublic:cSnapConObject(QObject *parent = 0);~cSnapConObject();public:static cSnapConObject *getInstance();public:bool connect(QString strIp, int nPort = 102,int nRack = 0, int nSlot = 1);               // 连接bool readInt16(uint16_t uAddr, int16_t &nValue,int nDb = 1);                             // 读取单个16位寄存器bool readMultInt16(uint16_t uStartAddr, int nCount,int16_t *buffer, int nDb = 1);        // 读取多个16位寄存器bool readInt32(uint16_t uAddr, int32_t &nValue, int nDb = 1);                            // 读取单个32位寄存器bool readMultiInt32(uint16_t uStartAddr, int nCount, int32_t *buffer, int nDb = 1);      // 读取多个32位寄存器bool readFloat(uint16_t uAddr, float &fValue, int nDb = 1);                              // 读取浮点数bool readMultiFloat(uint16_t uStartAddr, int nCount, float *buffer, int nDb = 1);        // 读取多个浮点数寄存器bool readM(uint16_t uStartByte, uint16_t uBitOffset, bool &bState, int nDb = 1);         // 读取M寄存器bool readInput_X(uint16_t uStartByte, uint16_t uBitOffset, bool &bState, int nDb = 1);   // 读取输入点bool readOutput_Y(uint16_t uStartByte, uint16_t uBitOffset, bool &bState, int nDb = 1);  // 读取输出点bool writeInt16(uint16_t uAddr, int16_t nValue, int nDb = 1);                               // 写入单个16位寄存器bool writeMultiInt16(uint16_t uStartAddr, int nCount, int16_t *buffer, int nDb = 1);        // 写入多个16位寄存器bool writeInt32(uint16_t uAddr, int32_t nValue, int nDb = 1);                               // 写入单个32位寄存器bool writeMultiInt32(uint16_t uStartAddr, int nCount, int32_t *buffer, int nDb = 1);        // 写入多个32位寄存器bool writeFloat(uint16_t uAddr, float fValue, int nDb = 1);                              // 写入单浮点数bool writeMultiFloat(uint16_t uStartAddr, int nCount, float *buffer, int nDb = 1);       // 写入多个浮点数 bool writeM(uint16_t uStartByte, uint16_t uBitOffset, bool bState, int nDb = 1);         // 写入M寄存器bool writeOutput_Y(uint16_t uStartByte, uint16_t uBitOffset, bool bState, int nDb = 1);  // 设置输出bool isConnected();                                                                      // 是否连接void release();                                                                          // 软件关闭调用private:void convertInt16ToBigEndian(int16_t value, byte* buffer);void convertInt32ToBigEndian(int32_t value, byte* buffer);int32_t bigEndianToLittleEndian(int32_t bigEndianValue);int16_t bigEndianToLittleEndian(int16_t bigEndianValue);protected:void run() override;private:sSnapData *m_ptr;QString m_strIp = "192.168.200.1";				// IP地址int m_nPort = 1000;								// 端口号int m_nConnectionType = 2;						// 连接类型int m_nDbNumber = 1;							// 数据块号int m_nRackNumber = 0;                          // 机架号int m_nSlotNumber = 1;                          // 卡槽号};

2.源文件

#include "Snap7ConObject.h"
#include "snap7.h"
#include <QDebug>
#include <QTime>
#include <QDataStream>struct sSnapData
{int nErrorCount = 0;bool bExit = false;bool bConneted = false;TS7Client *pClient = nullptr;QMutex funMutex;                                   // 为了保证通讯的稳定性,函数接口锁为必须
};// 不阻塞定时器
struct sSnap7Timer
{QTime time;uint32_t interval;void start(uint32_t t){interval = t;time.restart();};bool isTimeOut(){return time.elapsed() > interval;};
};cSnapConObject::cSnapConObject(QObject *parent): QThread(parent), m_ptr(new sSnapData())
{m_ptr->pClient = new TS7Client();this->start();
}cSnapConObject::~cSnapConObject()
{
}/**
* @brief	    获取示例对象
* @param[IN]	
* @param[OUT]
* @return       对象指针
*
* @note
*/
cSnapConObject *cSnapConObject::getInstance()
{static cSnapConObject instance;return &instance;
}void cSnapConObject::run()
{static int nStep = 0;static sSnap7Timer timeout;while (true){QThread::msleep(100);if (m_ptr->bExit)return;switch (nStep){case 0:{// 掉线重新连接if (m_ptr->nErrorCount > 50){nStep = 1;}}break;case 1:{if (!m_ptr->pClient->Connected()){int nRet = m_ptr->pClient->ConnectTo(m_strIp.toStdString().c_str(), m_nRackNumber, m_nSlotNumber);if (nRet == 0){m_ptr->nErrorCount = 0;m_ptr->bConneted = true;}elsem_ptr->bConneted = false;}else{m_ptr->nErrorCount = 0;}timeout.start(5 * 1000);nStep = 2;}break;case 2:{if (timeout.isTimeOut()){nStep = 0;}}break;default:break;}}
}// 连接
bool cSnapConObject::connect(QString strIp, int nPort, int nRack, int nSlot)
{m_strIp = strIp;m_nPort = nPort;m_nRackNumber = nRack;m_nSlotNumber = nSlot;int nRet = m_ptr->pClient->ConnectTo(strIp.toStdString().c_str(), nRack, nSlot);if (nRet == 0)m_ptr->bConneted = true;elsem_ptr->bConneted = false;return m_ptr->bConneted;
}// 读取VW寄存器值(16)位
bool cSnapConObject::readInt16(uint16_t uAddr, int16_t &nValue,int nDb)
{if (!m_ptr->bConneted)return false;int16_t buffer[1] = { 0 };bool bRet = readMultInt16(uAddr, 1, buffer, nDb);nValue = buffer[0];return bRet;
}// 批量读取16位
bool cSnapConObject::readMultInt16(uint16_t uStartAddr, int nCount, int16_t *buffer, int nDb)
{if (!m_ptr->bConneted)return false;// 创建用于读取的数据缓冲区QByteArray data(nCount * sizeof(int16_t), 0);int nRet = m_ptr->pClient->ReadArea(S7AreaDB, nDb, uStartAddr, nCount * sizeof(int16_t), S7WLByte, data.data());if (nRet == 0){// 如果没有错误QDataStream dataStream(data);dataStream.setByteOrder(QDataStream::BigEndian); // 设置字节序为大端// 逐个读取 qint16 数据并转换for (int i = 0; i < nCount; ++i){int16_t value;dataStream >> value; // 读取 qint16 值//buffer[i] = bigEndianToLittleEndian(value);buffer[i] = (value);}return true;}elsem_ptr->nErrorCount++;return false;
}// 读取VD寄存器值(32)位
bool cSnapConObject::readInt32(uint16_t uAddr, int32_t &nValue, int nDb)
{if (!m_ptr->bConneted)return false;int32_t buffer[1] = { 0 };bool bRet = readMultiInt32(uAddr, 1, buffer, nDb);nValue = buffer[0];return bRet;
}// 批量读取32位
bool cSnapConObject::readMultiInt32(uint16_t uStartAddr, int nCount, int32_t *buffer, int nDb)
{if (!m_ptr->bConneted)return false;// 创建用于读取的数据缓冲区QByteArray data(nCount * sizeof(int32_t), 0);int nRet = m_ptr->pClient->ReadArea(S7AreaDB, nDb, uStartAddr, nCount * sizeof(int32_t), S7WLByte, data.data());if (nRet == 0){// 如果没有错误QDataStream dataStream(data);dataStream.setByteOrder(QDataStream::BigEndian); // 设置字节序为大端// 逐个读取 int32_t 数据并转换for (int i = 0; i < nCount; ++i){int32_t value;dataStream >> value; // 读取 int32_t 值//buffer[i] = bigEndianToLittleEndian(value);buffer[i] = (value);}return true;}return false;
}// 读取浮点
bool cSnapConObject::readFloat(uint16_t uAddr, float &fValue, int nDb)
{float fArray[1] = {0.0};bool bRet = readMultiFloat(uAddr,1,fArray);fValue = fArray[0];return bRet;
}// 读取多个浮点数寄存器
bool cSnapConObject::readMultiFloat(uint16_t uStartAddr, int nCount, float *buffer, int nDb)
{if (!m_ptr->bConneted)return false;// 创建用于读取的数据缓冲区int nSize = sizeof(float);QByteArray data(nCount * sizeof(float), 0);int nRet = m_ptr->pClient->ReadArea(S7AreaDB, nDb, uStartAddr, nCount * sizeof(float), S7WLByte, data.data());if (nRet == 0){// 如果没有错误QDataStream dataStream(data);//dataStream.setByteOrder(QDataStream::BigEndian); // 设置字节序为大端dataStream.setFloatingPointPrecision(QDataStream::SinglePrecision);// 逐个读取 float 数据并转换for (int i = 0; i < nCount; ++i){float value;dataStream >> value; // 读取 float 值buffer[i] = (value);}return true;}return false;
}// 读取M x.x
bool cSnapConObject::readM(uint16_t uStartByte, uint16_t uBitOffset, bool &bState, int nDb)
{if (!m_ptr->bConneted)return false;uint8_t boolValue = 0;  // 存储读取到的布尔值int nRet = m_ptr->pClient->ReadArea(S7AreaMK, nDb, uStartByte, 1, S7WLBit, &boolValue);if (nRet == 0){bState = (boolValue & (1 << uBitOffset)) != 0;return true;}elsem_ptr->nErrorCount++;return false;
}// 读取输入点
bool cSnapConObject::readInput_X(uint16_t uStartByte, uint16_t uBitOffset, bool &bState, int nDb)
{if (!m_ptr->bConneted)return false;uint8_t boolValue = 0; int nRet = m_ptr->pClient->ReadArea(S7AreaPE, nDb, uStartByte, 1, S7WLBit, &boolValue);if (nRet == 0){bState = (boolValue & (1 << uBitOffset)) != 0;return true;}elsem_ptr->nErrorCount++;return false;
}// 读取输出点
bool cSnapConObject::readOutput_Y(uint16_t uStartByte, uint16_t uBitOffset, bool &bState, int nDb)
{if (!m_ptr->bConneted)return false;uint8_t boolValue = 0;int nRet = m_ptr->pClient->ReadArea(S7AreaPA, nDb, uStartByte, 1, S7WLBit, &boolValue);if (nRet == 0){bState = (boolValue & (1 << uBitOffset)) != 0;return true;}elsem_ptr->nErrorCount++;return false;
}// 写入16位整数
bool cSnapConObject::writeInt16(uint16_t uAddr, int16_t nValue, int nDb)
{int16_t buffer[1] = { nValue };return writeMultiInt16(uAddr, 1, buffer, nDb);
}// 批量写入
bool  cSnapConObject::writeMultiInt16(uint16_t uStartAddr, int nCount, int16_t *buffer, int nDb)
{if (!m_ptr->bConneted)return false;std::vector<byte> bufferTemp(nCount * sizeof(int16_t)); // 将 INT16 数据转换为大端格式并填入缓冲区for (size_t i = 0; i < nCount; ++i) {convertInt16ToBigEndian(buffer[i], &bufferTemp[i * sizeof(int16_t)]);}int nRet = m_ptr->pClient->WriteArea(S7AreaDB, nDb, uStartAddr,nCount*sizeof(int16_t), S7WLByte, bufferTemp.data());if (nRet == 0)return true;elsem_ptr->nErrorCount++;return false;
}// 写入32位整数
bool cSnapConObject::writeInt32(uint16_t uAddr, int32_t nValue, int nDb)
{if (!m_ptr->bConneted)return false;int32_t buffer[1] = { nValue };return writeMultiInt32(uAddr,1,buffer,nDb);
}// 批量写入
bool cSnapConObject::writeMultiInt32(uint16_t uStartAddr, int nCount, int32_t *buffer, int nDb)
{if (!m_ptr->bConneted)return false;std::vector<byte> bufferTemp(nCount * sizeof(int32_t));// 将 INT32 数据转换为大端格式并填入缓冲区for (size_t i = 0; i < nCount; ++i){convertInt32ToBigEndian(buffer[i], &bufferTemp[i * sizeof(int32_t)]);}int nRet = m_ptr->pClient->WriteArea(S7AreaDB, nDb, uStartAddr,nCount*sizeof(int32_t), S7WLByte, bufferTemp.data());if (nRet == 0)return true;elsem_ptr->nErrorCount++;return false;
}// 写入浮点数
bool cSnapConObject::writeFloat(uint16_t uAddr, float fValue, int nDb)
{float buffer[1] = { fValue };return writeMultiFloat(uAddr,1,buffer,nDb);
}// 批量写入浮点数
bool cSnapConObject::writeMultiFloat(uint16_t uStartAddr, int nCount, float *buffer, int nDb)
{if (!m_ptr->bConneted)return false;// 准备要写入的数据的字节数组QByteArray byteArray;for (size_t i = 0; i < nCount; ++i){float value = buffer[i];QByteArray tempData(reinterpret_cast<const char*>(&value), sizeof(float));// 大端转换:将字节顺序反转for (int j = sizeof(float) - 1; j >= 0; --j) {byteArray.append(tempData[j]);}}int nRet = m_ptr->pClient->WriteArea(S7AreaDB, nDb, uStartAddr, byteArray.size(), S7WLByte, byteArray.data());if (nRet == 0)return true;elsem_ptr->nErrorCount++;return false;
}// 写入M x.x
bool cSnapConObject::writeM(uint16_t uStartByte, uint16_t uBitOffset, bool bState, int nDb)
{if (!m_ptr->bConneted)return false;// 准备写入的数据uint8_t dataToWrite = 0;if (bState) dataToWrite = (1 << uBitOffset);  // 构造要写入的数据// 读取当前的值uint8_t currentData = 0;int nRet = m_ptr->pClient->ReadArea(S7AreaMK, nDb, uStartByte, 1, S7WLBit, &currentData);if (nRet != 0){m_ptr->nErrorCount++;return false;}// 更新数据if (bState)currentData |= dataToWrite;		// eg.设置 M2.2 对应的位else currentData &= ~dataToWrite;  //  eg.清除 M2.2 对应的位// 写入int nRet1 = m_ptr->pClient->ReadArea(S7AreaMK, nDb, uStartByte, 1, S7WLBit, &currentData);if (nRet1 == 0)return true;elsem_ptr->nErrorCount++;return false;
}// 设置输入点
bool cSnapConObject::writeOutput_Y(uint16_t uStartByte, uint16_t uBitOffset, bool bState, int nDb)
{if (!m_ptr->bConneted)return false;// 准备写入的数据uint8_t dataToWrite = 0;if (bState)dataToWrite = (1 << uBitOffset);  // 构造要写入的数据// 读取当前的值uint8_t currentData = 0;int nRet = m_ptr->pClient->ReadArea(S7AreaPA, nDb, uStartByte, 1, S7WLBit, &currentData);if (nRet != 0)return false;// 更新数据if (bState)currentData |= dataToWrite;		elsecurrentData &= ~dataToWrite;  // 写入int nRet1 = m_ptr->pClient->ReadArea(S7AreaPA, nDb, uStartByte, 1, S7WLBit, &currentData);if (nRet1 == 0)return true;elsem_ptr->nErrorCount++;return false;
}// 16位转大端模式
void cSnapConObject::convertInt16ToBigEndian(int16_t value, byte* buffer)
{buffer[0] = (value >> 8) & 0xFF; // 高字节buffer[1] = value & 0xFF;        // 低字节
}// 32位转大端模式
void cSnapConObject::convertInt32ToBigEndian(int32_t value, byte* buffer)
{buffer[0] = (value >> 24) & 0xFF; // 第一个字节buffer[1] = (value >> 16) & 0xFF; // 第二个字节buffer[2] = (value >> 8) & 0xFF;  // 第三个字节buffer[3] = value & 0xFF;         // 第四个字节
}// 32位大端转小端
int32_t cSnapConObject::bigEndianToLittleEndian(int32_t bigEndianValue)
{// 将大端字节转换为小端字节return ((bigEndianValue << 24) & 0xFF000000) |  // 高字节移到低字节((bigEndianValue << 8) & 0x00FF0000) |  // 次高字节移到次低字节((bigEndianValue >> 8) & 0x0000FF00) |  // 次低字节移到次高字节((bigEndianValue >> 24) & 0x000000FF);    // 低字节移到高字节
}// 16位大端转小端
int16_t cSnapConObject::bigEndianToLittleEndian(int16_t bigEndianValue)
{// 将大端字节转换为小端字节return (bigEndianValue << 8) | ((bigEndianValue >> 8) & 0xFF);
}/**
* @brief        是否连接成功
* @param[IN]
* @param[OUT]
* @return       true - 成功
*               false - 失败
* @note
*/
bool cSnapConObject::isConnected()
{return m_ptr->bConneted;
}/**
* @brief         资源释放,确保线程退出,软件关闭的时候调用
* @param[IN]
* @param[OUT]
* @return
*
* @note
*/
void cSnapConObject::release()
{m_ptr->bExit = true;if (m_ptr->pClient->Connected()){m_ptr->pClient->Disconnect();}
}

二、下载连接

https://download.csdn.net/download/u013083044/89939160

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/59146.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式】结构型模式(一):适配器模式、装饰器模式

结构型模式&#xff08;一&#xff09;&#xff1a;适配器模式、装饰器模式 1.适配器模式&#xff08;Adapter&#xff09;2.装饰器模式&#xff08;Decorator&#xff09;2.1 主要特点2.2 组成部分2.3 示例代码2.3.1 Component 组件2.3.2 ConcreteComponent 具体组件2.3.3 Dec…

认识物联网

新一代信息技术 物联网 物物相连的互联网&#xff0c;即物联网&#xff0c;又称传感器常见的传感器 • 温度传感器 • 压力传感器 • 声音传感器 • 02 • */08521 物联网概念 • 通过射频识别&#xff0c;红外传感器&#xff0c;全球定位系统GPS&#xff0c;激光扫描…

iOS 再谈KVC、 KVO

故事背景&#xff1a;大厂面试&#xff0c;又问道了基本的kvc kvo的原理和使用&#xff0c;由于转了前端&#xff0c;除了个setter和getter&#xff0c;我全忘记了&#xff0c;其实还是没有理解记忆&#xff0c;下面再看一下kvc 和kvo ,总结一个让人通过理解而无法忘记的方法&a…

07.适配器模式设计思想

07.适配器模式设计思想 目录介绍 01.适配器模式基础 1.1 适配器模式由来1.2 适配器模式定义1.3 适配器模式场景1.4 适配器模式思考 02.适配器模式实现 2.1 罗列一个场景2.2 用例子理解适配器2.3 适配器基本实现2.4 如何选择适配器 03.适配器模式分析 3.1 类适配器案例3.2 对象…

C语言 | Leetcode 题解之第535题TinyURL的加密与解密

题目&#xff1a; 题解&#xff1a; typedef struct {int key;char *val;UT_hash_handle hh; } HashItem;HashItem *dataBase NULL;char* encode(char* longUrl) {srand(time(0));int key;HashItem * pEntry NULL;while (true) {key rand();pEntry NULL;HASH_FIND_INT(dat…

Linux:线程安全的单例模式

设计模式 设计模式听上去是个很高贵的名词&#xff0c;其实就是是一套 多数人知晓、被反复使用、经过分类编目的、代码设计经验的总结&#xff0c;简称&#xff1a;对于编程比较典的场景的解决方案 单例模式 单例模式就是其中一种设计模式&#xff0c;是设计模式里的创建型模…

基于qt vs下的视频播放

**在 VS 2022 和 Qt 环境下利用 FFmpeg 实现一个基础视频播放器&#xff0c;需要完成以下几个步骤&#xff1a; 准备工作&#xff1a; 下载并配置 FFmpeg。确保 FFmpeg 的库和头文件可供 VS 2022 项目使用。 配置 Qt 项目&#xff0c;并导入 FFmpeg 库。 项目结构&#xff1a…

Django ORM详解:事务与F、Q函数使用

事务 #事务 from django.db import transaction from django.db.models import F # 装饰器用法&#xff1a;transaction.atomic def viewfunc(request):# 这些代码会在一个事务中执行... # with用法 try:#开启事物之后只有在事物里面的代码都正确运行完成才会执行相应的操作wit…

【网络安全】揭示 Web 缓存污染与欺骗漏洞

未经许可,不得转载。 文章目录 前言污染与欺骗Web 缓存污染 DoS1、HTTP 头部超大 (HHO)2、HTTP 元字符 (HMC)3、HTTP 方法覆盖攻击 (HMO)4、未键入端口5、重定向 DoS6、未键入头部7、Host 头部大小写规范化8、路径规范化9、无效头部 CP-DoS10、HTTP 请求拆分Web 缓存污染与有害…

AI打造超写实虚拟人物:是科技奇迹还是伦理挑战?

内容概要 在这个科技飞速发展的时代&#xff0c;超写实虚拟人物仿佛从科幻小说中走进了我们的日常生活。它们以生动的形象和细腻的动作&#xff0c;不仅在影视、广告和游戏中吸引了无数目光&#xff0c;更让我们对AI技术的未来充满了期待和疑惑。这些数字化身在逼真的外貌下&a…

第三次RHCSA作业

1、配置网络&#xff1a;为网卡添加一个本网段IPV4地址&#xff0c;x.x.x.123 2、配置yum本地仓库&#xff0c;并完成traceroute命令的安装 yum库配置成功过后&#xff0c;显示这个报错&#xff0c;没能写完 3、用至少两种方法查看sshd服务的进程号 4、添加一块10G大小的磁盘&…

前端用docker部署

1、环境检查 首先需要确认服务器上是否已经安装docker了。 在服务器上执行docker -v 显示对应的版本号说明已经安装好了docker 2、部署 使用Docker部署若依项目的前端服务&#xff0c;我们最终实现的是&#xff1a;启动一个镜像&#xff0c;我们的整个前端就启动了&#xf…

【Python开发】大模型应用开发项目整理

不知不觉已经入职3个月了&#xff0c;同事很好&#xff0c;工作充实&#xff0c;学到了很多东西&#xff0c;大大小小的需求也实现了接近20个。负责2个主要component&#xff0c;数据抓取和利用GenAI做数据提取。 1 背景 提取新闻中事件关键信息&#xff0c;比如人名&#xff…

论文翻译:ICLR 2024.DETECTING PRETRAINING DATA FROM LARGE LANGUAGE MODELS

文章目录 检测大型语言模型的预训练数据摘要1 引言2 预训练数据检测问题2.1 问题定义和挑战2.2 WIKIMIA&#xff1a;动态评估基准 3 MIN-K% PROB&#xff1a;简单的无参考预训练数据检测方法4 实验4.1 数据集和指标4.2 基线检测方法4.3 实现和结果4.4 分析 5 案例研究&#xff…

使用Jest进行JavaScript单元测试

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Jest进行JavaScript单元测试 引言 Jest 简介 安装 Jest 创建基本配置 编写测试用例 运行测试 快照测试 模拟函数 代码覆盖率…

根据关键字搜索商品API返回值解析:深入解析与代码实践

在电子商务和数据集成领域&#xff0c;API&#xff08;应用程序编程接口&#xff09;扮演着至关重要的角色。通过API&#xff0c;开发者可以访问和利用平台的数据资源&#xff0c;实现自动化和智能化的数据交互。本文将探讨如何根据关键字搜索商品API的返回值进行解析&#xff…

哈尔滨华时信息技术有限公司,特色之处见怎么样

哈尔滨华时信息技术有限公司的特色之处体现在以下几个方面&#xff1a; 1. **技术优势**&#xff1a; - **无线网络技术专长**&#xff1a;在无线网络领域有深厚的技术积累和优势。具备高度的灵活性与移动性&#xff0c;能为客户提供灵活的网络解决方案&#xff0c;满足如移动…

【书生.浦语实战营】——入门岛

【书生.浦语实战营】——入门岛_第一关_Linux基础 任务分布1. 本地vscode远程连接并进行端口映射端口映射What——何为端口映射How——怎么进行端口映射 2. Linux基础命令touch &#xff1a;创建文件mkdir &#xff1a;创建目录cd:进入 退出 目录pwd :确定当前所在目录cat:可以…

KubeVirt 安装和配置 Windows虚拟机

本文将将介绍如何安装 KubeVirt 和使用 KubeVirt 配置 Windows 虚拟机。 前置条件 准备 Ubuntu 操作系统&#xff0c;一定要安装图形化界面。 安装 Docker&#xff08;最新版本&#xff09; 安装 libvirt 和 TigerVNC&#xff1a; apt install libvirt-daemon-system libvir…

RHCE——DNS域名解析服务器、selinux、防火墙

1、DNS简介 DNS &#xff08; Domain Name System &#xff09;是互联网上的一项服务&#xff0c;它作为将域名和 IP 地址相互映射的一个分布式 数据库&#xff0c;能够使人更方便的访问互联网。 DNS 系统使用的是网络的查询&#xff0c;那么自然需要有监听的 port 。 DNS 使…