Qt 实现简单的tcp网络通信

news2024/11/26 2:44:56

文章目录

    • 成品效果图:
    • 代码:
      • 工具头文件tool.h
      • UI文件代码 ui_widget.h:
      • 窗口头文件 widget.h:
      • 窗口源文件widget.cpp:
    • 相关代码说明:
      • Qt获取本机ip:
      • Qt 打开,监视服务端端口:
      • Qt 客户端连接服务端:
      • Qt 服务端被连接后接收显示并接收消息:
      • Qt 发送消息:
    • 最后:
    • 成品:

背景:
最近计网要结课了,匆忙之间有个计网实验还没做。
上网这里查查那里查查,随便搞搞
然后在 这篇文章里找到了能够实现的代码
自己想着把它图形化一下,最后在超级棒棒糖的帮助下实现了。

成品效果图:

在这里插入图片描述

代码:

工具头文件tool.h

该头文件用于添加一些要用到的库,直接引用这个库,比较方便美观

#ifndef TOOL_H
#define TOOL_H
#include<winsock2.h>
#include<QDateTime>

#include <ws2tcpip.h>
#include <stdio.h>
#include <QDebug>

#include <QNetworkInterface>
#include <QNetworkInterface>
#include <QDebug>
#include <QtNetwork>


#endif // TOOL_H

UI文件代码 ui_widget.h:

/********************************************************************************
** Form generated from reading UI file 'widget.ui'
**
** Created by: Qt User Interface Compiler version 5.12.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_WIDGET_H
#define UI_WIDGET_H

#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QFrame>
#include <QtWidgets/QGroupBox>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QLabel>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QTextBrowser>
#include <QtWidgets/QTextEdit>
#include <QtWidgets/QToolButton>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_Widget
{
public:
    QLabel *label;
    QTextBrowser *SeverState;
    QFrame *line;
    QToolButton *send;
    QFrame *line_2;
    QTextBrowser *talk;
    QWidget *horizontalLayoutWidget;
    QHBoxLayout *horizontalLayout;
    QLabel *label_2;
    QLineEdit *posline;
    QToolButton *Open;
    QGroupBox *groupBox;
    QLabel *label_3;
    QLineEdit *TheIp;
    QLabel *label_4;
    QLineEdit *TheHost;
    QToolButton *connectIp;
    QTextBrowser *Showip;
    QLabel *label_5;
    QTextBrowser *connectState;
    QTextEdit *TextCin;

    void setupUi(QWidget *Widget)
    {
        if (Widget->objectName().isEmpty())
            Widget->setObjectName(QString::fromUtf8("Widget"));
        Widget->resize(1106, 823);
        label = new QLabel(Widget);
        label->setObjectName(QString::fromUtf8("label"));
        label->setGeometry(QRect(20, 180, 131, 41));
        label->setStyleSheet(QString::fromUtf8("font:20px"));
        SeverState = new QTextBrowser(Widget);
        SeverState->setObjectName(QString::fromUtf8("SeverState"));
        SeverState->setGeometry(QRect(10, 240, 271, 131));
        line = new QFrame(Widget);
        line->setObjectName(QString::fromUtf8("line"));
        line->setGeometry(QRect(350, 610, 761, 21));
        line->setFrameShape(QFrame::HLine);
        line->setFrameShadow(QFrame::Sunken);
        send = new QToolButton(Widget);
        send->setObjectName(QString::fromUtf8("send"));
        send->setGeometry(QRect(940, 720, 151, 71));
        send->setStyleSheet(QString::fromUtf8("font:30px"));
        line_2 = new QFrame(Widget);
        line_2->setObjectName(QString::fromUtf8("line_2"));
        line_2->setGeometry(QRect(340, 0, 31, 821));
        line_2->setFrameShape(QFrame::VLine);
        line_2->setFrameShadow(QFrame::Sunken);
        talk = new QTextBrowser(Widget);
        talk->setObjectName(QString::fromUtf8("talk"));
        talk->setGeometry(QRect(370, 20, 721, 571));
        horizontalLayoutWidget = new QWidget(Widget);
        horizontalLayoutWidget->setObjectName(QString::fromUtf8("horizontalLayoutWidget"));
        horizontalLayoutWidget->setGeometry(QRect(0, 80, 351, 71));
        horizontalLayout = new QHBoxLayout(horizontalLayoutWidget);
        horizontalLayout->setSpacing(6);
        horizontalLayout->setContentsMargins(11, 11, 11, 11);
        horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
        horizontalLayout->setContentsMargins(0, 0, 0, 0);
        label_2 = new QLabel(horizontalLayoutWidget);
        label_2->setObjectName(QString::fromUtf8("label_2"));
        label_2->setStyleSheet(QString::fromUtf8("font:25px;"));

        horizontalLayout->addWidget(label_2);

        posline = new QLineEdit(horizontalLayoutWidget);
        posline->setObjectName(QString::fromUtf8("posline"));

        horizontalLayout->addWidget(posline);

        Open = new QToolButton(horizontalLayoutWidget);
        Open->setObjectName(QString::fromUtf8("Open"));
        Open->setStyleSheet(QString::fromUtf8("font:30px"));

        horizontalLayout->addWidget(Open);

        groupBox = new QGroupBox(Widget);
        groupBox->setObjectName(QString::fromUtf8("groupBox"));
        groupBox->setGeometry(QRect(10, 390, 301, 261));
        groupBox->setStyleSheet(QString::fromUtf8("font:20px"));
        label_3 = new QLabel(groupBox);
        label_3->setObjectName(QString::fromUtf8("label_3"));
        label_3->setGeometry(QRect(10, 30, 221, 31));
        TheIp = new QLineEdit(groupBox);
        TheIp->setObjectName(QString::fromUtf8("TheIp"));
        TheIp->setGeometry(QRect(10, 60, 281, 31));
        label_4 = new QLabel(groupBox);
        label_4->setObjectName(QString::fromUtf8("label_4"));
        label_4->setGeometry(QRect(10, 110, 151, 41));
        TheHost = new QLineEdit(groupBox);
        TheHost->setObjectName(QString::fromUtf8("TheHost"));
        TheHost->setGeometry(QRect(10, 160, 281, 31));
        connectIp = new QToolButton(groupBox);
        connectIp->setObjectName(QString::fromUtf8("connectIp"));
        connectIp->setGeometry(QRect(20, 210, 161, 41));
        Showip = new QTextBrowser(Widget);
        Showip->setObjectName(QString::fromUtf8("Showip"));
        Showip->setGeometry(QRect(115, 10, 231, 41));
        label_5 = new QLabel(Widget);
        label_5->setObjectName(QString::fromUtf8("label_5"));
        label_5->setGeometry(QRect(10, 10, 101, 41));
        label_5->setStyleSheet(QString::fromUtf8("font:25px"));
        connectState = new QTextBrowser(Widget);
        connectState->setObjectName(QString::fromUtf8("connectState"));
        connectState->setGeometry(QRect(30, 660, 256, 151));
        TextCin = new QTextEdit(Widget);
        TextCin->setObjectName(QString::fromUtf8("TextCin"));
        TextCin->setGeometry(QRect(360, 620, 561, 191));

        retranslateUi(Widget);

        QMetaObject::connectSlotsByName(Widget);
    } // setupUi

    void retranslateUi(QWidget *Widget)
    {
        Widget->setWindowTitle(QApplication::translate("Widget", "\345\260\217chat", nullptr));
        label->setText(QApplication::translate("Widget", "\346\234\215\345\212\241\347\253\257\347\212\266\346\200\201\357\274\232", nullptr));
        send->setText(QApplication::translate("Widget", "\345\217\221\351\200\201", nullptr));
        label_2->setText(QApplication::translate("Widget", "\346\234\215\345\212\241\345\231\250\345\274\200\346\224\276\347\253\257\345\217\243", nullptr));
        Open->setText(QApplication::translate("Widget", "\346\211\223\345\274\200", nullptr));
        groupBox->setTitle(QApplication::translate("Widget", "\350\277\236\346\216\245\345\214\272", nullptr));
        label_3->setText(QApplication::translate("Widget", "\345\257\271\346\226\271\346\234\215\345\212\241\345\231\250ip\357\274\232", nullptr));
        label_4->setText(QApplication::translate("Widget", "\345\257\271\346\226\271\346\234\215\345\212\241\347\253\257\345\217\243\357\274\232", nullptr));
        connectIp->setText(QApplication::translate("Widget", "\350\277\236\346\216\245", nullptr));
        label_5->setText(QApplication::translate("Widget", "\346\234\254\346\234\272ip:", nullptr));
    } // retranslateUi

};

namespace Ui {
    class Widget: public Ui_Widget {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_WIDGET_H

窗口头文件 widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "tool.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);

    ~Widget();

private:
    Ui::Widget *ui;
    QTcpServer server;     //TCP控制本地服务器
    quint16 host;           //开放端口
    QTcpSocket *socket = new QTcpSocket(this);     //连接其他的Socket
    QTcpSocket *so = new QTcpSocket(this);         //被连接的Socket
    QString AimIp;
    quint16 AimPort;


private slots:
    void openHost(); //开放某个端口
    void toConnect(); //连接端口
    void toSend();      //发送信息
};

#endif // WIDGET_H

窗口源文件widget.cpp:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    QList<QHostAddress> list = QNetworkInterface::allAddresses();
    for(int nIter=0; nIter<list.count(); nIter++)
    {
        if(!list[nIter].isLoopback())
        {
            if(list[nIter].protocol() == QAbstractSocket::IPv4Protocol )
            {
                qDebug() << list[nIter].toString();
                ui->Showip->append(list[nIter].toString());
            }
        }
    }

    connect(ui->Open, &QToolButton::clicked,this, &Widget::openHost);//打开端口
    connect(ui->connectIp, &QToolButton::clicked,this,&Widget::toConnect);//连接
    connect(ui->send, &QToolButton::clicked, this,&Widget::toSend);
    //被连接
    connect(&server, &QTcpServer::newConnection, this, [=]() {
        so = server.nextPendingConnection();
        QString ip = so->peerAddress().toString();
        quint16 port = so->peerPort();
        qDebug() << "New connection from " << ip << ":" << port;

        QString m = "<font color='blue'>有新的连接来自"+ip+":"+QString::number(port)+"</font>";
        ui->SeverState->append(m);
        //被连接后接收信息:
        connect(so, &QTcpSocket::readyRead, this, [=]() {
            QDateTime currentDateTime = QDateTime::currentDateTime();
            QString ip = so->peerAddress().toString();
            QByteArray data = so->readAll();
            qDebug() << "Received data:" << data;
            QString mag1 = QString::fromUtf8(data);
            qDebug()<<currentDateTime;
            QString strDateTime = currentDateTime.toString("yyyy-MM-dd hh:mm:ss");
            QString mag = "<font color='blue'>"+strDateTime+"收到来自"+ip+"的消息:"+mag1+"</font>";
            ui->talk->append(mag);
        });
    });


    //连接成功:
    connect(socket, &QTcpSocket::connected, this, [=]() {
        qDebug() << "Connected to server.";

        // 发送信息给服务端
        QByteArray message = "连接你了";
        socket->write(message);
    });

    // 接收服务端发送的信息
    connect(socket, &QTcpSocket::readyRead, this, [=]() {
        QDateTime currentDateTime = QDateTime::currentDateTime();
        QString strDateTime = currentDateTime.toString("yyyy-MM-dd hh:mm:ss");
        QString ip = socket->peerAddress().toString();
        QByteArray data = socket->readAll();
        QString message = QString::fromUtf8(data);
        qDebug() << "Received message from server:" << message;
        QString mag = "<font color='blue'>"+strDateTime+"收到来自"+ip+"的消息:"+message+"</font>";
        ui->talk->append(mag);
    });


}



void Widget::openHost(){
    int temp = this->ui->posline->text().toInt();
    this->host = static_cast<quint16>(temp);
    qDebug()<<"端口:"<<this->host<<endl;

    server.close();
    if(!this->server.listen(QHostAddress::Any, this->host)){
        qDebug()<<"端口开放失败"<<endl;
        this->ui->SeverState->append("<font color='red'>端口开放失败</font>");
    }
    else{
        this->ui->SeverState->append(this->ui->posline->text()+"端口已开放");
    }

}

void Widget::toConnect(){

    AimIp = ui->TheIp->text();
    int h = ui->TheHost->text().toInt();
    AimPort = static_cast<quint16>(h);
    socket->connectToHost(AimIp,AimPort);
    if (socket->waitForConnected()) {
        // 连接成功
        qDebug() << "Connected to server!";
        QString mag = "连接"+this->AimIp+"的端口"+ui->TheHost->text()+"成功";
        ui->connectState->append(mag);



    } else {
        // 连接失败
        QString mag = "连接"+this->AimIp+"的端口"+ui->TheHost->text()+"失败";
        qDebug() << "Failed to connect to server: " << socket->errorString();
        mag = "<font color='red'>"+mag+"</font>";
        ui->connectState->append(mag);
    }
}

void Widget::toSend(){
    QString mag = this->ui->TextCin->toPlainText();
    so->write(mag.toUtf8());
    so->flush();
    so->waitForBytesWritten();
    socket->write(mag.toUtf8());
    socket->flush();
    socket->waitForBytesWritten();
    QDateTime currentDateTime = QDateTime::currentDateTime();
    QString strDateTime = currentDateTime.toString("yyyy-MM-dd hh:mm:ss");
    QString smag = strDateTime+"向"+this->AimIp+"发送消息:"+mag;
    ui->talk->append(smag);
    ui->TextCin->clear();
}


Widget::~Widget()
{
    delete ui;
}

相关代码说明:

Qt获取本机ip:

	QList<QHostAddress> list = QNetworkInterface::allAddresses();
    for(int nIter=0; nIter<list.count(); nIter++)
    {
        if(!list[nIter].isLoopback())
        {
            if(list[nIter].protocol() == QAbstractSocket::IPv4Protocol )
            {
                qDebug() << list[nIter].toString();//输出端口信息
            }
        }
    }
    

Qt 打开,监视服务端端口:

QTcpServer server;
quint16 host = 8080;
server.listen(QHostAddress::Any, host);

这里的listen()函数则是打开端口并监视,不过要注意,一个server只能打开监视一个端口。

Qt 客户端连接服务端:

这里的客户端其实也就是你自己的主机,你自己的主机也可以充当服务端捏。

	QString AimIp = "127.0.0.1"
    quint16 AimPort = 8080;
    QTcpSocket *socket = new QTcpSocket();
    socket->connectToHost(AimIp,AimPort);//连接函数
    if (socket->waitForConnected()) {
        // 连接成功
        qDebug() << "Connected to server!";

    } else {
        // 连接失败
        qDebug() << "连接失败";
    }

Qt 服务端被连接后接收显示并接收消息:

connect(&server, &QTcpServer::newConnection, this, [=]() {
        so = server.nextPendingConnection();
        QString ip = so->peerAddress().toString();
        quint16 port = so->peerPort();
        qDebug() << "New connection from " << ip << ":" << port;

        QString m = "<font color='blue'>有新的连接来自"+ip+":"+QString::number(port)+"</font>";
        ui->SeverState->append(m);
        //被连接后接收信息:
        connect(so, &QTcpSocket::readyRead, this, [=]() {
            QDateTime currentDateTime = QDateTime::currentDateTime();
            QString ip = so->peerAddress().toString();
            QByteArray data = so->readAll();//获取消息
            qDebug() << "Received data:" << data;
            QString mag1 = QString::fromUtf8(data);
            qDebug()<<currentDateTime;
            QString strDateTime = currentDateTime.toString("yyyy-MM-dd hh:mm:ss");
            QString mag = "<font color='blue'>"+strDateTime+"收到来自"+ip+"的消息:"+mag1+"</font>";
            ui->talk->append(mag);
        });
    });

Qt 发送消息:

主要通过QTcpSocket的write()函数进行发送消息。

void Widget::toSend(){
    QString mag = this->ui->TextCin->toPlainText();
    so->write(mag.toUtf8());
    so->flush();
    so->waitForBytesWritten();
    socket->write(mag.toUtf8());
    socket->flush();
    socket->waitForBytesWritten();
    QDateTime currentDateTime = QDateTime::currentDateTime();
    QString strDateTime = currentDateTime.toString("yyyy-MM-dd hh:mm:ss");
    QString smag = strDateTime+"向"+this->AimIp+"发送消息:"+mag;
    ui->talk->append(smag);
    ui->TextCin->clear();
}

最后:

这个东东只能进行简单的tcp通讯,而且要求连接的是同一局域网的两台设备才能进行交流,不过也的确是这样的,除非你有额外的设备什么的~
当然,如果你想整个QQ那种的东西出来的话,可以整个中间服务器,然后让不同的客户端都访问那个中间服务器,通过中间服务器进行交流~

成品:

链接:https://pan.baidu.com/s/1VqygMyjETYg5cRbLOvMbZQ?pwd=8rtr
提取码:8rtr

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

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

相关文章

自建小网站——在idea中如何运行一个vue项目完整过程

这些天Darren洋计划筹建一个属于自己的个人博客空间小网站&#xff0c;其中选择的就是vue项目类型的网站&#xff0c;因为在运行vue项目途中不是特别顺利&#xff0c;现整理了一下流程供大家参考学习。 一、从git上pull一个vue项目 先登录git官网&#xff0c;pull一个vue项目包…

【ElasticSearch】HTTP调用API

文章目录 数据格式HTTP操作索引操作映射操作文档操作(添加数据)高级查询定义数据查询所有文档匹配查询多字段匹配查询关键字精确查询多关键字精确查询指定查询字段过滤字段组合查询范围查询模糊查询*单字段排序多字段排序高亮查询分页查询聚合查询对某个字段取最大值 max对某个…

Channel Distillation: Channel-Wise Attention for Knowledge Distillation 原理与代码解析

paper&#xff1a;Channel Distillation: Channel-Wise Attention for Knowledge Distillation official implementation&#xff1a;https://github.com/zhouzaida/channel-distillation 存在的问题 教师模型传递的知识不够好&#xff0c;学生模型无法准确地从教师模型学习…

java基础语法总复习思维导图 + 重难点+面试题

前言 小亭子正在努力的学习编程&#xff0c;接下来将开启javaEE的学习~~ 分享的文章都是学习的笔记和感悟&#xff0c;如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话&#xff0c;烦请点赞关注支持一波, 感激不尽~~ 【需要可修改的思维导图可以私信我&#xff0…

Packet Tracer - 静态路由故障排除

Packet Tracer - 静态路由故障排除 地址分配表 设备 接口 IPv4 地址 子网掩码 默认网关 R1 G0/0 172.31.1.1 255.255.255.128 不适用 S0/0/0 172.31.1.194 255.255.255.252 不适用 R2 G0/0 172.31.0.1 255.255.255.0 不适用 S0/0/0 172.31.1.193 255.255…

Windows server 2012 R2系统怎么安装IIS管理器?

Windows server 2012 R2系统怎么安装IIS管理器&#xff1f;今天飞飞和你分享。服务器大本营&#xff0c;技术文章内容集合站发车啦&#xff01; 首先我们用电脑自带的远程连接桌面工具进入服务器&#xff0c;在任务栏左下角有个服务器管理器&#xff0c;单击打开 打开后在右上…

【致敬未来的攻城狮计划】— 连续打卡第十六天:FSP固件库系统定时器(滴答定时器SysTick)每2秒LED闪烁一次

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

跟着杰哥学强化学习:多臂老虎机问题

多臂老虎机问题 现在有3台外观一模一样的老虎机,每个老虎机的赔率是不同的,摇动一次需要1块钱,现在给你100块钱,如何获取最大的收益。 如果我们知道了每个老虎的赔率,那么只要选择收益最高的那个老虎机就可以了,但现在问题是并不知道每个老虎机的收益。为了简单,我们假…

linux 安装rocketmq

首先准备虚拟机一台 下载linux 64位 jdk1.8(自行百度资源) 下载 | RocketMQ (apache.org) cd /usr/local/ #这是我的本机的现有目录 mkdir rocketmq mkdir jdk 1.借助linux客户端工具,上传刚下载好的jdk安装包到java文件夹 2.借助linux客户端工具,上传刚下载好的二进制安装包…

「C/C++」C/C++软件跨平台思维

博客主页&#xff1a;何曾参静谧的博客 文章专栏&#xff1a;「C/C」C/C学习 目录 相关术语一、编写可移植的代码&#xff1a;二、使用跨平台的C库和框架&#xff1a;三、进行兼容性测试&#xff1a;四、用户界面设计&#xff1a; 相关术语 跨平台思维&#xff1a;是指在软件开…

D-Link DSL-2888A 远程命令执行漏洞(CVE-2020-24581/24579)

漏洞描述 D-Link DSL-2888A AU_2.31_V1.1.47ae55之前版本存在安全漏洞&#xff0c;该漏洞源于包含一个execute cmd.cgi特性(不能通过web用户界面访问)&#xff0c;该特性允许经过身份验证的用户执行操作系统命令。 在该版本固件中同时存在着一个不安全认证漏洞&#xff08;CVE…

【软考网络管理员】2023年软考网管初级常见知识考点(2)- 数据通信技术

【写在前面】也是趁着五一假期前再写几篇分享类的文章给大家&#xff0c;希望看到我文章能给软考网络管理员备考的您带来一些帮助&#xff0c;5月27号也是全国计算机软件考试统一时间&#xff0c;也就不用去各个地方找资料和代码了。紧接着我就把我整理的一些资料分享给大家哈&…

04 KVM虚拟化网络概述

文章目录 04 KVM虚拟化网络概述4.1 Linux Bridge4.2 Open vSwitch 04 KVM虚拟化网络概述 为了使虚拟机可以与外部进行网络通信&#xff0c;需要为虚拟机配置网络环境。KVM虚拟化支持Linux Bridge、Open vSwitch网桥等多种类型的网桥。如图1所示&#xff0c;数据传输路径为“虚…

InstructGPT 论文阅读笔记

目录 简介 数据集 详细实现 实验结果 参考资料 简介 InstructGPT 模型是在论文《Training language models to follow instructions with human feedback》被提出的&#xff0c;OpenAI在2022年1月发布了这篇文章。 论文摘要翻译&#x…

AttributeError: ‘Document‘ object has no attribute ‘pageCount‘ PyMuPDF库

这可能是由于PyMuPDF库更新导致的&#xff0c;里面的一些函数名发生了变化 1. AttributeError: Document object has no attribute pageCount 将 pageCount改为 page_count 2. AttributeError: Matrix object has no attribute preRotate 将preRotate改为prerotate 3.Attribut…

关于FFMPEG中的filter滤镜的简单介绍

滤镜的作用主要是对原始的音视频数据进行处理以实现各种各样的效果。比如叠加水印&#xff0c;翻转缩放视频等。 下图表示的正常转码流程&#xff0c;滤镜在解码和编码中间&#xff0c;虚线表示可有可无。 使用命令查看ffmpeg支持的滤镜 ffmpeg -filters 查看某个滤镜的详细参…

k210点亮LED灯

开发板上自带的3个led灯接线如图。 点亮led灯主要使用两个模块&#xff0c;如下&#xff1a; fm.register(pin,function,forceFalse) 【pin】芯片外部 IO 【function】芯片功能 【force】True 则强制注册&#xff0c;清除之前的注册记录 例&#xff1a;fm.register(12, fm.f…

真题详解(有向图)-软件设计(六十二)

真题详解&#xff08;极限编程&#xff09;-软件设计&#xff08;六十一)https://blog.csdn.net/ke1ying/article/details/130435971 CMM指软件成熟度模型&#xff0c;一般1级成熟度最低&#xff0c;5级成熟度最高&#xff0c;采用更高级的CMM模型可以提高软件质量。 初始&am…

RepVGG学习笔记

RepVGG 0 前言1 结构重参数化1.1 结构重参数化第一步&#xff08;将 C o n v 2 D Conv2D Conv2D算子和 B N BN BN算子融合以及将只有 B N BN BN的分支转换成一个 C o n v 2 D Conv2D Conv2D算子&#xff09;1.2 结构重参数化第二步&#xff08;多分支的 3 3 3\times3 33卷积融…

安全运营 ldap监控域控信息

0x00 背景 公司有多个主域&#xff0c;子域&#xff0c;有的子域因为境外数据安全的问题无法把日志传输到境内。那么如何在没有日志的情况下监控子域或者互信域的组织单元(OU)信息呢。 由于访问互信域要在域控上进行&#xff0c;本文根据最小权限原则监控普通用户也可以访问的…