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.pswp.cn/news/446074.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446074.shtml
英文地址,請注明出處:http://en.pswp.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;首先要用一小句話引…