qt triggered信号_Qt之网络编程UDP通信

点击上方“Qt学视觉”,选择“星标”公众号重磅干货,第一时间送达

想要学习的同学们还请认真阅读每篇文章,相信你一定会有所收获

UDP通信概述

     UDP(UserDatagramProtocol,用户数据报协议)是轻量的、不可靠的、面向数据报(datagram)、无连接的协议,它可以用于对可靠性要求不高的场合与TCP通信不同,两个程序之间进行UDP通信无 需预先建立持久的socket连接,UDP每次发送数据报都需要指定目标地址和端口(如下图所示)。 

eb0bd9a02b16f32fde790918fe3bf54d.png

    QUdpSocket类用于实现UDP通信,它从QAbstractSocket类继承,因而与QTcpSocket共享 大部分的接口函数。主要区别是QUdpSocket以数据报传输数据,而不是以连续的数据流。发送数 据报使用函数QUdpSocket::writeDatagram(),数据报的长度一般少于512字节,每个数据报包含发 送者和接收者的IP地址和端口等信息。 

    要进行UDP数据接收,要用QUdpSocket::bind()函数先绑定一个端口,用于接收传入的数据 报。当有数据报传入时会发射readyRead()信号,使用readDatagram()函数来读取接收到的数据报。UDP消息传送有单播、广播、组播三种模式

aa7fbb59bd04eeef089eadabcf9d6c2d.png

  • 单播(unicast)模式:一个UDP客户端发出的数据报只发送到另一个指定地址和端口的 UDP客户端,是一对一的数据传输。

  • 广播(broadcast)模式:一个UDP客户端发出的数据报,在同一网络范围内其他所有的UDP客户端都可以收到。QUdpSocket支持IPv4广播。广播经常用于实现网络发现的协议。要获取广播数据只需在数据报中指定接收端地址为QHostAddres::Broadcast, —般的广播 地址是 255.255.255.255。

  • 组播(multicast)模式:也称为多播。UDP客户端加入到另一个组播IP地址指定的多播 组,成员向组播地址发送的数据报组内成员都可以接收到,类似于QQ群的功能. QUdpSocket::joinMulticastGroup()函数实现加入多播组的功能,加入多播组后,UDP数据 的收发与正常的UDP数据收发方法一样。

    使用广播和多播模式,UDP可以实现一些比较灵活的通信功能,而TCP通信只有单播模式, 没有广播和多播模式。所以,UDP通信虽然不能保证数据传输的准确性,但是具有灵活性,一般 的即时通信软件都是基于UDP通信的。 

    QUdpSocket类从QAbstractSocket继承而来,但是又定义了较多新的功能函数用于实现UDP 特有的一些功能,如数据报读写和多播通信功能。QUdpSocket没有定义新的信号。QUdpSocket 的主要功能函数见表

  • bool bind(quint 16 port = 0)

    • 为UDP通信绑定一个端口

  • qint64 writeDatagram(QByteArray &datagram, QHostAddress &host, quint 16 port)

    • 向目标地址和端口的UDP客户端发送数据报,返回成功 发送的字节数

  • bool hasPendingDatagrams()

    • 当至少有一个数据报需要读取时,返回true

  • qint64 pendingDatagramSize()

    • 返回第一个待读取的数据报的大小

  • qint64 readDatagram(char *data, qint64 maxSize)

    • 读取一个数据报,返回成功读取的数据报的字节数

  • bool joinMulticastGroup(QHostAddress &groupAddress)

    • 加入一个多播组

  • bool leaveMulticastGroup(QHostAddress &groupAddress)     

    • 离开一个多播组

    在单播、广播和多播模式下,UDP程序都是对等的,不像TCP通信那样分为客户端和服务器 端。多播和广播的实现方式基本相同,只是数据报的目标IP地址设置不同,多播模式需要加入多 播组,实现方式有较大差异。

例程如下

077f998561af3065d07f37f3d778a901.png

头文件

#pragma once#include #include "ui_QGuiUdpClient.h"#include #include class QGuiUdpClient : public QMainWindow{    Q_OBJECTpublic:    QGuiUdpClient(QWidget *parent = Q_NULLPTR);    ~QGuiUdpClient();private slots:    //自定义槽函数    void onSocketStateChange(QAbstractSocket::SocketState socketState);    void onSocketReadyRead();//读取socket传入的数据    void actStart_triggered();    void actStop_triggered();    void actHostInfo_triggered();    void actClear_triggered();    void btnSend_clicked();    void btnBroadcast_clicked();private:    Ui::QGuiUdpClient ui;private:    QLabel* m_pLabSocketState;//socket状态显示标签    QUdpSocket* m_pUdpSocket;//    QString getLocalIP();//获取本机IP地址};

源文件

#include "QGuiUdpClient.h"#include #pragma execution_character_set("utf-8")QGuiUdpClient::QGuiUdpClient(QWidget *parent)    : QMainWindow(parent){    ui.setupUi(this);    m_pLabSocketState = new QLabel("Socket状态:");//    m_pLabSocketState->setMinimumWidth(200);    ui.statusBar->addWidget(m_pLabSocketState);    QString localIP = getLocalIP();//本机IP    this->setWindowTitle(this->windowTitle() + "----本机IP:" + localIP);    ui.comboTargetIP->addItem(localIP);    m_pUdpSocket = new QUdpSocket(this);//用于与连接的客户端通讯的QTcpSocket    connect(m_pUdpSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)),        this, SLOT(onSocketStateChange(QAbstractSocket::SocketState)));    onSocketStateChange(m_pUdpSocket->state());    connect(m_pUdpSocket, SIGNAL(readyRead()), this, SLOT(onSocketReadyRead()));    connect(ui.actStart, SIGNAL(triggered()), this, SLOT(actStart_triggered()));    connect(ui.actStop, SIGNAL(triggered()), this, SLOT(actStop_triggered()));    connect(ui.actHostInfo, SIGNAL(triggered()), this, SLOT(actHostInfo_triggered()));    connect(ui.actClear, SIGNAL(triggered()), this, SLOT(actClear_triggered()));    connect(ui.btnSend, SIGNAL(clicked()), this, SLOT(btnSend_clicked()));    connect(ui.btnBroadcast, SIGNAL(clicked()), this, SLOT(btnBroadcast_clicked()));}QGuiUdpClient::~QGuiUdpClient(){    m_pUdpSocket->abort();    delete m_pUdpSocket;}void QGuiUdpClient::onSocketStateChange(QAbstractSocket::SocketState socketState){    switch (socketState)    {    case QAbstractSocket::UnconnectedState:        m_pLabSocketState->setText("scoket状态:UnconnectedState");        break;    case QAbstractSocket::HostLookupState:        m_pLabSocketState->setText("scoket状态:HostLookupState");        break;    case QAbstractSocket::ConnectingState:        m_pLabSocketState->setText("scoket状态:ConnectingState");        break;    case QAbstractSocket::ConnectedState:        m_pLabSocketState->setText("scoket状态:ConnectedState");        break;    case QAbstractSocket::BoundState:        m_pLabSocketState->setText("scoket状态:BoundState");        break;    case QAbstractSocket::ClosingState:        m_pLabSocketState->setText("scoket状态:ClosingState");        break;    case QAbstractSocket::ListeningState:        m_pLabSocketState->setText("scoket状态:ListeningState");        break;    }}void QGuiUdpClient::onSocketReadyRead(){    while (m_pUdpSocket->hasPendingDatagrams())    {        QByteArray   datagram;        datagram.resize(m_pUdpSocket->pendingDatagramSize());        QHostAddress    peerAddr;        quint16 peerPort;        m_pUdpSocket->readDatagram(datagram.data(), datagram.size(), &peerAddr, &peerPort);        QString str = datagram.data();        QString peer = "[From " + peerAddr.toString() + ":" + QString::number(peerPort) + "] ";        ui.plainTextEdit->appendPlainText(peer + str);    }}void QGuiUdpClient::actStart_triggered(){    quint16     port = ui.spinBindPort->value(); //本机UDP端口    if (m_pUdpSocket->bind(port))//绑定端口成功    {        ui.plainTextEdit->appendPlainText("**已成功绑定");        ui.plainTextEdit->appendPlainText("**绑定端口:" + QString::number(m_pUdpSocket->localPort()));        ui.actStart->setEnabled(false);        ui.actStop->setEnabled(true);    }    else        ui.plainTextEdit->appendPlainText("**绑定失败");}void QGuiUdpClient::actStop_triggered(){    m_pUdpSocket->abort(); //不能解除绑定    ui.actStart->setEnabled(true);    ui.actStop->setEnabled(false);    ui.plainTextEdit->appendPlainText("**已解除绑定");}void QGuiUdpClient::actHostInfo_triggered(){    QString hostName = QHostInfo::localHostName();//本地主机名    ui.plainTextEdit->appendPlainText("本机主机名:" + hostName + "\n");    QHostInfo   hostInfo = QHostInfo::fromName(hostName);    QList addList = hostInfo.addresses();//    if (!addList.isEmpty())    {        for (int i = 0; i < addList.count(); i++)        {            QHostAddress aHost = addList.at(i);            if (QAbstractSocket::IPv4Protocol == aHost.protocol())            {                QString IP = aHost.toString();                ui.plainTextEdit->appendPlainText("本机IP地址:" + aHost.toString());                if (ui.comboTargetIP->findText(IP) < 0)                    ui.comboTargetIP->addItem(IP);            }        }    }}void QGuiUdpClient::actClear_triggered(){    ui.plainTextEdit->clear();}void QGuiUdpClient::btnSend_clicked(){    QString     targetIP = ui.comboTargetIP->currentText(); //目标IP    QHostAddress    targetAddr(targetIP);    quint16     targetPort = ui.spinTargetPort->value();//目标port    QString  msg = ui.editMsg->text();//发送的消息内容    QByteArray  str = msg.toUtf8();    m_pUdpSocket->writeDatagram(str, targetAddr, targetPort); //发出数据报    ui.plainTextEdit->appendPlainText("[out] " + msg);    ui.editMsg->clear();    ui.editMsg->setFocus();}void QGuiUdpClient::btnBroadcast_clicked(){    quint16     targetPort = ui.spinTargetPort->value(); //目标端口    QString  msg = ui.editMsg->text();    QByteArray  str = msg.toUtf8();    m_pUdpSocket->writeDatagram(str, QHostAddress::Broadcast, targetPort);    ui.plainTextEdit->appendPlainText("[broadcast] " + msg);    ui.editMsg->clear();    ui.editMsg->setFocus();}QString QGuiUdpClient::getLocalIP(){    QString hostName = QHostInfo::localHostName();//本地主机名    QHostInfo   hostInfo = QHostInfo::fromName(hostName);    QString   localIP = "";    QList addList = hostInfo.addresses();//    if (!addList.isEmpty())    {        for (int i = 0; i < addList.count(); i++)        {            QHostAddress aHost = addList.at(i);            if (QAbstractSocket::IPv4Protocol == aHost.protocol())            {                localIP = aHost.toString();                break;            }        }    }    return localIP;}

0135d29158cf4d0f2b7a9e5b9bec6f2c.png

头文件

#pragma once#include #include "ui_QGuiUdpServer.h"#include #include class QGuiUdpServer : public QMainWindow{    Q_OBJECTpublic:    QGuiUdpServer(QWidget *parent = Q_NULLPTR);    ~QGuiUdpServer();private slots:    //自定义槽函数    void onSocketStateChange(QAbstractSocket::SocketState socketState);    void onSocketReadyRead();//读取socket传入的数据    void actStart_triggered();    void actStop_triggered();    void actHostInfo_triggered();    void actClear_triggered();    void btnSend_clicked();    void btnBroadcast_clicked();private:    Ui::QGuiUdpServer ui;private:    QLabel* m_pLabSocketState;//socket状态显示标签    QUdpSocket* m_pUdpSocket;//    QString getLocalIP();//获取本机IP地址};

源文件

#include "QGuiUdpServer.h"#include #pragma execution_character_set("utf-8")QGuiUdpServer::QGuiUdpServer(QWidget *parent)    : QMainWindow(parent){    ui.setupUi(this);    m_pLabSocketState = new QLabel("Socket状态:");//    m_pLabSocketState->setMinimumWidth(200);    ui.statusBar->addWidget(m_pLabSocketState);    QString localIP = getLocalIP();//本机IP    this->setWindowTitle(this->windowTitle() + "----本机IP:" + localIP);    ui.comboTargetIP->addItem(localIP);    m_pUdpSocket = new QUdpSocket(this);//用于与连接的客户端通讯的QTcpSocket    connect(m_pUdpSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)),        this, SLOT(onSocketStateChange(QAbstractSocket::SocketState)));    onSocketStateChange(m_pUdpSocket->state());    connect(m_pUdpSocket, SIGNAL(readyRead()), this, SLOT(onSocketReadyRead()));    connect(ui.actStart, SIGNAL(triggered()), this, SLOT(actStart_triggered()));    connect(ui.actStop, SIGNAL(triggered()), this, SLOT(actStop_triggered()));    connect(ui.actHostInfo, SIGNAL(triggered()), this, SLOT(actHostInfo_triggered()));    connect(ui.actClear, SIGNAL(triggered()), this, SLOT(actClear_triggered()));    connect(ui.btnSend, SIGNAL(clicked()), this, SLOT(btnSend_clicked()));    connect(ui.btnBroadcast, SIGNAL(clicked()), this, SLOT(btnBroadcast_clicked()));}QGuiUdpServer::~QGuiUdpServer(){    m_pUdpSocket->abort();    delete m_pUdpSocket;}void QGuiUdpServer::onSocketStateChange(QAbstractSocket::SocketState socketState){    switch (socketState)    {    case QAbstractSocket::UnconnectedState:        m_pLabSocketState->setText("scoket状态:UnconnectedState");        break;    case QAbstractSocket::HostLookupState:        m_pLabSocketState->setText("scoket状态:HostLookupState");        break;    case QAbstractSocket::ConnectingState:        m_pLabSocketState->setText("scoket状态:ConnectingState");        break;    case QAbstractSocket::ConnectedState:        m_pLabSocketState->setText("scoket状态:ConnectedState");        break;    case QAbstractSocket::BoundState:        m_pLabSocketState->setText("scoket状态:BoundState");        break;    case QAbstractSocket::ClosingState:        m_pLabSocketState->setText("scoket状态:ClosingState");        break;    case QAbstractSocket::ListeningState:        m_pLabSocketState->setText("scoket状态:ListeningState");        break;    }}void QGuiUdpServer::onSocketReadyRead(){    while (m_pUdpSocket->hasPendingDatagrams())    {        QByteArray   datagram;        datagram.resize(m_pUdpSocket->pendingDatagramSize());        QHostAddress    peerAddr;        quint16 peerPort;        m_pUdpSocket->readDatagram(datagram.data(), datagram.size(), &peerAddr, &peerPort);        QString str = datagram.data();        QString peer = "[From " + peerAddr.toString() + ":" + QString::number(peerPort) + "] ";        ui.plainTextEdit->appendPlainText(peer + str);    }}void QGuiUdpServer::actStart_triggered(){    quint16     port = ui.spinBindPort->value(); //本机UDP端口    if (m_pUdpSocket->bind(port))//绑定端口成功    {        ui.plainTextEdit->appendPlainText("**已成功绑定");        ui.plainTextEdit->appendPlainText("**绑定端口:" + QString::number(m_pUdpSocket->localPort()));        ui.actStart->setEnabled(false);        ui.actStop->setEnabled(true);    }    else        ui.plainTextEdit->appendPlainText("**绑定失败");}void QGuiUdpServer::actStop_triggered(){    m_pUdpSocket->abort(); //不能解除绑定    ui.actStart->setEnabled(true);    ui.actStop->setEnabled(false);    ui.plainTextEdit->appendPlainText("**已解除绑定");}void QGuiUdpServer::actHostInfo_triggered(){    QString hostName = QHostInfo::localHostName();//本地主机名    ui.plainTextEdit->appendPlainText("本机主机名:" + hostName + "\n");    QHostInfo   hostInfo = QHostInfo::fromName(hostName);    QList addList = hostInfo.addresses();//    if (!addList.isEmpty())    {        for (int i = 0; i < addList.count(); i++)        {            QHostAddress aHost = addList.at(i);            if (QAbstractSocket::IPv4Protocol == aHost.protocol())            {                QString IP = aHost.toString();                ui.plainTextEdit->appendPlainText("本机IP地址:" + aHost.toString());                if (ui.comboTargetIP->findText(IP) < 0)                    ui.comboTargetIP->addItem(IP);            }        }    }}void QGuiUdpServer::actClear_triggered(){    ui.plainTextEdit->clear();}void QGuiUdpServer::btnSend_clicked(){    QString     targetIP = ui.comboTargetIP->currentText(); //目标IP    QHostAddress    targetAddr(targetIP);    quint16     targetPort = ui.spinTargetPort->value();//目标port    QString  msg = ui.editMsg->text();//发送的消息内容    QByteArray  str = msg.toUtf8();    m_pUdpSocket->writeDatagram(str, targetAddr, targetPort); //发出数据报    ui.plainTextEdit->appendPlainText("[out] " + msg);    ui.editMsg->clear();    ui.editMsg->setFocus();}void QGuiUdpServer::btnBroadcast_clicked(){    quint16     targetPort = ui.spinTargetPort->value(); //目标端口    QString  msg = ui.editMsg->text();    QByteArray  str = msg.toUtf8();    m_pUdpSocket->writeDatagram(str, QHostAddress::Broadcast, targetPort);    ui.plainTextEdit->appendPlainText("[broadcast] " + msg);    ui.editMsg->clear();    ui.editMsg->setFocus();}QString QGuiUdpServer::getLocalIP(){    QString hostName = QHostInfo::localHostName();//本地主机名    QHostInfo   hostInfo = QHostInfo::fromName(hostName);    QString   localIP = "";    QList addList = hostInfo.addresses();//    if (!addList.isEmpty())    {        for (int i = 0; i < addList.count(); i++)        {            QHostAddress aHost = addList.at(i);            if (QAbstractSocket::IPv4Protocol == aHost.protocol())            {                localIP = aHost.toString();                break;            }        }    }    return localIP;}

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

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

相关文章

adguard没有核心 core no_面试官:线程池如何按照core、max、queue的执行顺序去执行?...

前言这是一个真实的面试题。前几天一个朋友在群里分享了他刚刚面试候选者时问的问题&#xff1a;"线程池如何按照core、max、queue的执行循序去执行&#xff1f;"。我们都知道线程池中代码执行顺序是&#xff1a;corePool->workQueue->maxPool&#xff0c;源码…

linux加密框架 crypto 算法管理 - 算法查找接口 crypto_larval_lookup

参考链接 Linux加密框架的算法管理&#xff08;二&#xff09;_家有一希的博客-CSDN博客 crypto_larval_lookup函数介绍 crypto_larval_lookup函数的输入参数包括待查找的算法名name、算法类型type和算法类型屏蔽位mask&#xff0c;查找命中时返回查找到的算法或注册用算法幼…

linux加密框架 crypto 算法管理 - 算法查找接口 crypto_alg_lookup函数

参考链接 Linux加密框架的算法管理&#xff08;二&#xff09;_家有一希的博客-CSDN博客 函数介绍 static struct crypto_alg *crypto_alg_lookup(const char *name, u32 type,u32 mask) {struct crypto_alg *alg;u32 test 0;if (!((type | mask) & CRYPTO_ALG_TESTED))…

linux加密框架 crypto 算法管理 - 动态和静态算法管理

参考链接 Linux加密框架的算法管理&#xff08;三&#xff09;_家有一希的博客-CSDN博客 动态和静态算法管理 静态算法 加密框架中的算法分为静态算法和动态算法两种&#xff0c;其中静态算法指的是以"算法名.ko"形式存在的静态编译的算法模块&#xff0c;如aes.k…

linux加密框架 crypto 算法管理 - 算法检测

参考链接 Linux加密框架的算法管理&#xff08;四&#xff09;_家有一希的博客-CSDN博客 函数介绍 如前所述&#xff0c;无论是静态算法还是动态算法&#xff0c;算法注册的最后一步都是进行算法正确性检验&#xff0c;一般流程是先调用__crypto_register_alg函数进行通用的算…

select选中的值_selenium下拉框处理(select)

前言 web自动化中&#xff0c;常见的场景还有一个下拉框的选择&#xff0c;哪么在selenium中如何做下拉框的操作呢&#xff1f;selectselect在HTML中表示元素名&#xff0c;可创建单选或多选菜单。HTML中select长什么样子&#xff1a;select在HTML中元素名&#xff0c;下面有选…

linux加密框架 crypto 算法管理 - 创建哈希算法实例

crypto_alloc_ahash函数 加密框架中的哈希算法可以是同步方式实现的也可以是异步方式实现的&#xff0c;但是算法应用不关注哈希算法的实现方式&#xff0c;关注的是哈希算法提供的算法接口。为实现统一管理&#xff0c;加密框架默认哈希算法的实现方式为异步方式&#xff0c;…

发票管理软件_企业为什么需要ERP企业管理软件?

对于一个制造企业来说&#xff0c;生产是企业最大的动力&#xff0c;而生产也需要进行优化管理&#xff0c;一个好的生产管理方式会带给企业巨大的发展空间和利润价值。对于一个制造企业来说&#xff0c;生产是企业最大的动力&#xff0c;而生产也需要进行优化管理&#xff0c;…

linux加密框架 crypto 算法管理 - 应用角度讲解加密框架的运行流程

参考链接 Linux加密框架的应用示例&#xff08;一&#xff09;_家有一希的博客-CSDN博客 本文大纲 本节将从应用角度说明加密框架的运行流程&#xff0c;包括加密框架如何管理算法、如何动态创建算法&#xff0c;应用模块如何创建算法实例、如何通过算法实例调用算法接口等。…

java 累进计费率计算_设计费400万,缴纳所得税100万,如何筹划

很多公司老板都会把利润放在第一位&#xff0c;照理说这是没错的&#xff0c;公司要盈利才能继续经营下去。我国有很多针对小微企业的政策&#xff0c;盈利不高的情况下&#xff0c;基本不会去考虑纳税问题&#xff0c;也没有多少税收压力。但是对一些暴利的服务型行业、软件设…

linux加密框架 crypto 算法管理 - 哈希算法应用实例

参考链接 Linux加密框架应用示例&#xff08;二&#xff09;_家有一希的博客-CSDN博客linux加密框架 crypto 算法管理 - 应用角度讲解加密框架的运行流程_CHYabc123456hh的博客-CSDN博客 在应用模块中创建并初始化哈希算法实例 假设某个SA配置使用的认证算法为"hmac(md5…

Linux加密框架 crypto crypto_larval | crypto_larval_alloc | __crypto_register_alg 介绍

参考链接 Lniux加密框架中的主要数据结构&#xff08;五&#xff09;_家有一希的博客-CSDN博客crypto_larval struct crypto_larval {struct crypto_alg alg;struct crypto_alg *adult;struct completion completion;u32 mask; };结构体名叫 crypto_larval &#xff08;算法幼…

好玩的脚本代码大全_Github | 推荐一个Python脚本集合项目

点击上方"蓝字"关注我们Python大数据分析记录 分享 成长用python写小脚本是一件好玩的事情&#xff0c;因为不是个大活儿&#xff0c;而且能解决眼边前十分繁琐的事情&#xff0c;这种轻松且便宜的代码颇受人民群众的欢迎~有点生活小妙招的意味大家较为熟知的脚本…

linux加密框架 crypto 算法管理 - 算法查找接口

参考链接 Linux加密框架的算法管理&#xff08;二&#xff09;_家有一希的博客-CSDN博客linux加密框架 crypto 算法管理 - 算法查找接口 crypto_find_alg_CHYabc123456hh的博客-CSDN博客linux加密框架 crypto 算法管理 - 算法查找接口 crypto_alg_mod_lookup_CHYabc123456hh的…

xml模糊查询语句_2Mybatis学习笔记07:动态SQL语句(原创,转载请注明来源)

开发环境&#xff1a;硬件环境&#xff1a;Windows10JDK 1.8&#xff1b; 软件环境&#xff1a;JavaEclipseMybatismaven3.6tomcat8.0Postgresql 10.6&#xff1b; 用到的jar包&#xff1a; asm-3.3.1.jar cglib-2.2.2.jar commons-logging-1.1.1.jar javassist-3.17.1-GA.jar …

硬件密码组件的硬件结构、作用及实现应用设计

引 言 1 硬件密码组件的概念 密码技术是解决信息安全问题的核心技术。要实现信息的保密性、完整性、可控性和不可否认性等安全要求&#xff0c;都离不开密码技术的运用。在具体的信息安全系统中&#xff0c;密码技术的运用可以基于软件密码组件&#xff08;简称为SCM&#xf…

sql倒序查询语句_SQL丨1.基本查询语句复习

此为自用查询语句1.selectSELECT column1,column2 FROM table1;常用的格式惯例&#xff1a;大写了SELECT和FROM&#xff0c;而将表名和列名小写&#xff1b;通常在列名中使用下划线&#xff0c;避免使用空格&#xff1b;在每个语句末尾添加分号&#xff1b;SQL不区分大小写。2.…

基于区块链的档案共享 项目启动

注意事项 已经备份了一个配置fabric的完整ubuntu系统&#xff0c;其需要注意的细节如下1&#xff0c;此镜像系统需要配置host文件&#xff0c;sudo vim /etc/hosts&#xff0c;添加如下内容127.0.0.1 orderer.example.com peer0.org1.example.com peer1.org1.example.c…

知道一点怎么设直线方程_【初中数学】反比例函数策略(二) ——构造方程法...

【相关阅读】【初中数学】反比例函数策略之一 ——数形结合反比例函数策略(二)——构造方程法(王 桥)上一次&#xff0c;咱们探讨了解决反比例函数的策略一——数形结合&#xff0c;本节课我们继续反比例函数的策略(二)——构造方程法。构造方程法&#xff0c;在《春季攻势》第…

wpf将文字转化为图形_将创新转化为实际应用

Worldsensing是全球公认的物联网先驱。这家位于西班牙巴塞罗那的技术供应商成立于2008年&#xff0c;为城市和传统行业提供运营情报。伊格纳西维拉霍萨纳(IgnasiVilajosana)是公司联合创始人兼首席执行官。伊格纳西拥有西班牙巴塞罗那大学物理学博士学位&#xff0c;还接受过美…