Qt之网络监测

发布于:2024-12-18 ⋅ 阅读:(82) ⋅ 点赞:(0)

在Qt中,网络监测通常涉及到检测网络连接状态、网络延迟、带宽使用情况等。Qt提供了一些类和模块来帮助开发者实现这些功能。以下是一些常用的方法和类:

1. 检测网络连接状态

QtNetwork模块中的QNetworkConfigurationManager类可以用来检测设备的网络连接状态。

#include <QNetworkConfigurationManager>
#include <QNetworkConfiguration>
#include <QDebug>

void checkNetworkConnection() {
    QNetworkConfigurationManager manager;
    bool isOnline = manager.isOnline();

    if (isOnline) {
        qDebug() << "Network is online.";
    } else {
        qDebug() << "Network is offline.";
    }
}

2. 检测网络延迟

网络延迟通常通过发送一个请求到服务器并测量响应时间来实现。可以使用QNetworkAccessManager来发送HTTP请求,并计算从发送请求到接收到响应的时间差。

#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QElapsedTimer>
#include <QDebug>

void checkNetworkLatency(const QUrl& url) {
    QNetworkAccessManager manager;
    QNetworkRequest request(url);

    QElapsedTimer timer;
    timer.start();

    QNetworkReply* reply = manager.get(request);
    QObject::connect(reply, &QNetworkReply::finished, [&]() {
        qint64 elapsed = timer.elapsed();
        qDebug() << "Latency:" << elapsed << "ms";
        reply->deleteLater();
    });
}

3. 检测带宽使用情况

Qt本身没有直接提供检测带宽使用情况的API,但可以通过定时发送和接收数据包,并计算数据量来估算带宽。

#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QTimer>
#include <QDebug>

void checkBandwidth(const QUrl& url) {
    QNetworkAccessManager manager;
    QNetworkRequest request(url);

    QNetworkReply* reply = manager.get(request);
    QTimer timer;
    timer.setInterval(1000); // 1 second interval
    timer.setSingleShot(false);

    QObject::connect(&timer, &QTimer::timeout, [&]() {
        qint64 bytesReceived = reply->bytesAvailable();
        qDebug() << "Bandwidth:" << bytesReceived << "bytes/s";
    });

    QObject::connect(reply, &QNetworkReply::finished, [&]() {
        timer.stop();
        reply->deleteLater();
    });

    timer.start();
}

4. 使用QNetworkInterface获取网络接口信息

QNetworkInterface类可以用来获取设备的网络接口信息,包括IP地址、MAC地址等。

#include <QNetworkInterface>
#include <QDebug>

void getNetworkInterfaces() {
    QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();

    for (const QNetworkInterface& interface : interfaces) {
        qDebug() << "Interface Name:" << interface.name();
        qDebug() << "Hardware Address:" << interface.hardwareAddress();

        QList<QNetworkAddressEntry> entries = interface.addressEntries();
        for (const QNetworkAddressEntry& entry : entries) {
            qDebug() << "IP Address:" << entry.ip().toString();
            qDebug() << "Netmask:" << entry.netmask().toString();
            qDebug() << "Broadcast:" << entry.broadcast().toString();
        }
    }
}

5. 使用QHostInfo解析域名

QHostInfo类可以用来解析域名到IP地址。

#include <QHostInfo>
#include <QDebug>

void resolveHostName(const QString& hostName) {
    QHostInfo::lookupHost(hostName, [](const QHostInfo& host) {
        if (host.error() != QHostInfo::NoError) {
            qDebug() << "Lookup failed:" << host.errorString();
            return;
        }

        for (const QHostAddress& address : host.addresses()) {
            qDebug() << "IP Address:" << address.toString();
        }
    });
}

总结

Qt提供了丰富的网络相关类和模块,可以帮助开发者实现网络监测功能。通过QNetworkConfigurationManager可以检测网络连接状态,通过QNetworkAccessManager可以检测网络延迟和带宽使用情况,通过QNetworkInterface可以获取网络接口信息,通过QHostInfo可以解析域名。

这些工具和类可以帮助你在Qt应用程序中实现各种网络监测功能,确保应用程序在不同的网络环境下都能正常运行。

实列代码:

#ifndef INTERNET_ARM64_H
#define INTERNET_ARM64_H
#include <QDialog>
#include <QWidget>
#include <QProcess>
#include <QTimer>
#include <QtNetwork/QNetworkConfigurationManager>
#include <QtNetwork/QNetworkConfiguration>
#include <QtNetwork/QNetworkInterface>
#include <QHostInfo>
#include <QDebug>
#define ETH_NAME   "eth0"
namespace Ui {
class internet_arm64;
}

class internet_arm64 : public QDialog
{
    Q_OBJECT

public:
    explicit internet_arm64(QWidget *parent = nullptr);
    ~internet_arm64();

signals:
    void internet_green(QString);
    void internet_red(QString);

private slots:
    void check_internet();

    void on_yes_clicked();

    void on_no_clicked();

private:
    Ui::internet_arm64 *ui;
     QTimer *timer = new QTimer;
};

#endif // INTERNET_ARM64_H

#include "internet_arm64.h"
#include "ui_internet_arm64.h"

internet_arm64::internet_arm64(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::internet_arm64)
{
    ui->setupUi(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(check_internet()));
    timer->start(1000);
   // check_internet();
}

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

void internet_arm64::check_internet()
{
    QNetworkInterface net= QNetworkInterface::interfaceFromName(ETH_NAME);
    /*IsUP 网络接口处于活动状态
    *IsRunning 网络接口已分配资源
    *IsLoopBack 网络接口为回环接口
    *name 为eth0
    */
    if(net.flags().testFlag(QNetworkInterface::IsUp)
            && net.flags().testFlag(QNetworkInterface::IsRunning)
            && !net.flags().testFlag(QNetworkInterface::IsLoopBack)
            && (net.name() == ETH_NAME))
    {
        /*ip*/
       // qDebug()<<net.allAddresses();
        //qDebug() << "eth0 is Connected";
        //获取IPv4地址
        QString ip="";
        QList<QNetworkInterface> interFaceList = QNetworkInterface::allInterfaces();
        for(int i=0; i< interFaceList.size(); i++)
        {
            QNetworkInterface interface = interFaceList.at(i);
            QList<QNetworkAddressEntry> entryList = interface.addressEntries();
            foreach(QNetworkAddressEntry entry, entryList)
            {
                if(QAbstractSocket::IPv4Protocol == entry.ip().protocol() &&
                   entry.ip() != QHostAddress::LocalHost && entry.ip().toString().startsWith("192.168."))
                {
                    ip = entry.ip().toString();
                    break;
                }
            }

        }

        emit internet_green("network green");
        ui->textEdit->append("IP:"+ip);
        ui->textEdit->append("以太网已连接");

    }
    else
    {
       // qDebug() << "eth0 is Not Connected";      

        emit internet_red("network red");
        ui->textEdit->append("请检查网络");
    }
}


void internet_arm64::on_yes_clicked()
{
    qDebug()<<"以太网测试成功";
    this->close();
}

void internet_arm64::on_no_clicked()
{
    qDebug()<<"以太网测试失败";
    this->close();
}