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;查找命中时返回查找到的算法或注册用算法幼…

python ssh 远程登录路由器执行命令_ssh批量登录并执行命令(python实现)

局域网内有一百多台电脑&#xff0c;全部都是linux操作系统&#xff0c;所有电脑配置相同&#xff0c;系统完全相同(包括用户名和密码)&#xff0c;ip地址是自动分配的。现在有个任务是在这些电脑上执行某些命令&#xff0c;者说进行某些操作&#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…

3分钟入门python_3分钟带你了解世界第一语言Python 入门上手也这么简单!

一、Python入门1. Python爬虫入门一之综述Python爬虫入门二之爬虫基础了解Python爬虫入门三之Urllib库的基本使用Python爬虫入门四之Urllib库的高级用法Python爬虫入门五之URLError异常处理Python爬虫入门六之Cookie的使用Python爬虫入门七之正则表达式Python爬虫入门八之Beaut…

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;…

python 画风场 scipy_Python数据分析及可视化实例之Scipy

强大到没有朋友的科学计算库&#xff0c;不知道怎么介绍ta&#xff01;大牛张若愚出了厚本的《Python 科学计算》第二版里面包罗万象&#xff0c;就不做搬运工了&#xff0c;尽快开工pandas。来一弹在NLP自然语言处理中用到的稀疏矩阵处理&#xff1a;# coding: utf-8# # 稀疏矩…

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…

guido python正式发布年份_Python语言适合哪些领域的计算问题? (1.3分)_学小易找答案...

【单选题】关于Python中的复数,下列说法错误的是 (1.3分)【多选题】药物作用的基本规律包括?【单选题】Python 中,以下哪个赋值操作符是错误的? (1.3分)【单选题】哪个选项是下面代码的执行结果? s "abcd1234" print ( s . find ( "cd" )) (1.3分)【填…

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的…

python中以下关于列表描述错误的_10. 以下关于列表操作的描述,错误的是:_学小易找答案...

【单选题】Python 语句 a1211.21 print(type(a)) 的输出结果为( )【单选题】Python语句序列"s1 [4, 5, 6]; s2 s1; s1[1]0; print(s2)"的运行结果是( )。【填空题】Python语句print(%d%%%d%(3/2, 3%2))的运行结果是( 1 )。【单选题】python语句print(type(123))的数…

写论文注意事项

参考链接 给研究生修改了一篇论文后&#xff0c;该985博导几近崩溃…… 重点分析 摘要与结论几乎重合 这一条是我见过研究生论文中最常出现的事情&#xff0c;很多情况下&#xff0c;他们论文中摘要部分与结论部分重复率超过70%。对于摘要而言&#xff0c;首先要用一小句话引…