Qt之网络监测

news/2024/12/15 12:25:57/

在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 intervaltimer.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_OBJECTpublic: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();
}

http://www.ppmy.cn/news/1555288.html

相关文章

ConfyUI(sd-webui)-aki-v4.9.1升级安装Torch 2.5.1-CUDA12.4【含安装包】

总结&#xff1a; 原地升级操作三步走【要有一个能正常运行的aki-v4.9.1&#xff0c;先压缩备份它】&#xff1a; 一、在绘世-高级选项-安装PyTorch时&#xff0c;找到接近并且低于N卡CUDA驱动版本的版本&#xff0c;显示安装成功&#xff1b; 二、重启绘世-高级选项-原生组件…

将PDF流使用 canvas 绘制然后转为图片展示在页面上(二)

将PDF流转为图片展示在页面上 使用 pdfjs-dist 库来渲染 PDF 页面到 canvas 上&#xff0c;然后将 canvas 转为图片 安装 pdfjs-dist 依赖 npm install pdfjs-dist 或者 yarn add pdfjs-dist创建一个组件来处理 PDF 流的加载和渲染 该组件中是一个包含 PDF 文件的 ArrayBuffer…

OGG FOR MYSQL同步DDL

以下实验测试OGG FOR mysql 同步DDL&#xff0c; OGG 21.3 MYSQL 8.0.27 --创建测试数据 create table oggddl_20241201 (oid int primary key ,oname varchar(10)); create table oggddl_20241202 (oid int primary key ,oname varchar(10)); create table oggddl_20241203…

php仿199万年历程序源码的实现方法和成品黄历站展示

以下是一个简单的方案&#xff0c;包含了前端设计思路、后端逻辑和黄历计算的基本实现。 设计方案 1. 项目架构 核心文件: Calendar.php: 封装黄历计算逻辑。index.php: 入口文件&#xff0c;处理用户输入并调用黄历类。 2. 黄历类设计 (Calendar.php) 属性: date: 存储用户…

ubuntu 用 ss-tproxy的最终网络结构

1、包含了AD广告域名筛选 2、Ss-tproxy 国内国外地址分类 3、chinadns-ng解析 4、透明网关 更多细节看之前博客 ubuntu 用ss-TPROXY实现透明代理&#xff0c;基于TPROXY的透明TCP/UDP代理,在 Linux 2.6.28 后进入官方内核。ubuntu 用 ss-tproxy的内置 DNS 前挂上 AdGuardHome…

杨振宁大学物理视频中黄色的字,c#写程序去掉(原版改进,二)

我发现&#xff0c;黄色消去比较稳定。 而色带矩形&#xff0c;经常变化&#xff0c;不稳定。 所以我们能不能先保证稳定的消去黄色&#xff1f;可以。 我们原来的代码黄色和色带矩形混在一起了&#xff0c;我们拆分开&#xff1a; 而且我们知道图像高度480&#xff0c;黄色…

Java 动态设置 JVM 参数的方法

Java虚拟机&#xff08;JVM&#xff09;在运行Java应用时&#xff0c;其性能调优和资源管理至关重要。虽然许多JVM参数在启动时通过命令行设置&#xff0c;但在应用运行期间动态调整某些参数也是可行的。通过动态设置JVM参数&#xff0c;开发者可以更有效地管理资源使用和优化性…

健康运动:开启活力生活的钥匙

健康运动&#xff1a;开启活力生活的钥匙 在现代社会&#xff0c;随着科技的飞速发展和生活节奏的加快&#xff0c;越来越多的人开始意识到健康的重要性。健康不仅关乎我们的身体状态&#xff0c;更直接影响到我们的心理状态和生活质量。而健康运动&#xff0c;作为维护和提升…