Qt基础 | 主机信息查询 | QHostInfo的介绍和使用 | QNetworkInterface的介绍和使用

news2024/11/16 22:44:14

文章目录

  • 一、Qt 网络模块介绍
  • 二、主机信息查询
    • 1.QHostlnfo 和 QNetworkInterface 类
    • 2.QHostlnfo 的使用
      • 2.1 获取本机主机名和 IP 地址
      • 2.2 查找主机的地址信息
    • 3.QNetworkInterface 的使用


Qt 网络模块:

  • Qt基础 | 主机信息查询 | QHostInfo的介绍和使用 | QNetworkInterface的介绍和使用

  • Qt基础 | TCP通信 | TCP服务端与客户端程序设计 | QTcpServer | QTcpSocket

  • Qt基础 | UDP通信 | UDP单播、广播、组播的介绍与实现

  • Qt基础 | 基于HTTP协议的网络文件下载


一、Qt 网络模块介绍

  Qt 网络模块提供用于编写 TCP/IP 客户端和服务器端程序的各种类,如用于 TCP 通信的 QTcpSocket 和 QTcpServer,用于 UDP 通信的 QUdpSocket,还有用于实现 HTTP、FTP等普通网络协议的高级类如:QNetworkRequest、QNetworkReply 和 QNetworkAccessManager。Qt 网络模块还提供用于网络代理、网络承载管理的类,提供基于安全套接字层(SSL)协议的安全网络通信的类。

  要在程序中使用Qt 网络模块,需要在项目配置文件中增加一条配置语句:

Qt   +=  network

  下面介绍基本的 TCP 和 UDP 网络通信类的使用,基于 HTTP 的网络下载管理的实现。

二、主机信息查询

1.QHostlnfo 和 QNetworkInterface 类

  查询一个主机的 MAC地址或 IP 地址是网络应用程序中经常用到的功能, Qt 提供了 QHostInfo 和 QNetworklnterface 类可以用于此类信息的查询。

QHostlnfo类的常用函数如下
image-20240729172602846

  QNetworklnterface 可以获得运行应用程序的主机的所有 IP 地址和网络接口列表。静态函数alllnterfaces() 返回主机上所有的网络接口的列表,一个网络接口可能包括多个 IP 地址,每个 IP地址与掩码或广播地址关联。如果无需知道子网掩码和广播的 IP 地址,使用静态函数 allAddresses()可以获得主机上的所有 IP 地址列表 。

QNetworklnterface类的常用函数如下
image-20240729173741804

2.QHostlnfo 的使用

2.1 获取本机主机名和 IP 地址

  首先,通过QHostlnfo::localHostName() 函数获取本机主机名 hostName,然后再使用主机名作为参数,通过 QHostlnfo::fromName(QString &name) 函数返回指定主机名的主机信息 hostInfo。hostInfo 是 QHostInfo 的实例,通过其函数 addresses() 获取主机的 IP 地址列表 addList。返回的 addList 是 QHostAddress 类的列表。QHostAddress 类提供了一个 IP 地址信息,包括了 IPv4 地址和 IPv6 地址,有两个主要的函数:

  • protocol()函数

    返回 QAbstractSocket::NetworkLayerProtocol 枚举类型变量 ,表示当前 IP 地址的协议类型

    枚举值如下:

    image-20240730110425969

  • toString()函数

    返回 IP 地址的字符串

程序如下:

void Dialog::on_btnGetHostInfo_clicked()
{//QHostInfo获取主机信息
//    ui->plainTextEdit->clear();

    QString hostName=QHostInfo::localHostName();//本地主机名
    ui->plainTextEdit->appendPlainText("本机主机名:"+hostName+"\n");

    QHostInfo   hostInfo=QHostInfo::fromName(hostName); //本机IP地址

    QList<QHostAddress> addList=hostInfo.addresses();//IP地址列表
    if (!addList.isEmpty())
    for (int i=0;i<addList.count();i++)
    {
        QHostAddress aHost=addList.at(i); //每一项是一个QHostAddress
        bool show=ui->chkOnlyIPv4->isChecked();//只显示IPv4
        if (show)
            show=(QAbstractSocket::IPv4Protocol==aHost.protocol()); //协议类型,
        else
            show=true;
        if (show) {
        ui->plainTextEdit->appendPlainText("协 议:"+protocolName(aHost.protocol()));//协议类型
        ui->plainTextEdit->appendPlainText("本机IP地址:"+aHost.toString()); //IP地址
        ui->plainTextEdit->appendPlainText("");
        }
    }
}

QString Dialog::protocolName(QAbstractSocket::NetworkLayerProtocol protocol)
{//通过协议类型返回协议名称
  switch(protocol)
  {
    case QAbstractSocket::IPv4Protocol:
        return "IPv4 Protocol";
    case QAbstractSocket::IPv6Protocol:
      return "IPv6 Protocol";
    case QAbstractSocket::AnyIPProtocol:
      return "Any IP Protocol";
    default:
      return "Unknown Network Layer Protocol";
   }
}

  单击 “QHostInfo 获取本机主机名和 IP 地址” 按钮,如果勾选了 “只显示 IPv4 协议地址” 复选框,就只显示本机的 IPv4 地址,否则显示所有的 IP 地址信息。

image-20240730110907501

2.2 查找主机的地址信息

  QHostInfo 的静态函数 QHostInfo::lookupHost() 函数可以根据主机名、域名或 IP 地址查找主机的地址信息。lookupHost() 函数原型如下:

[static] int QHostInfo::lookupHost(const QString &name, QObject *receiver, const char *member)
  • 函数说明:

    用于查找与主机名name关联的IP地址,当查询结果准备好时,会在receiver对象中调用member槽或信号,并使用QHostInfo参数。然后可以检查QHostInfo对象以获取查询结果。

    如果将字面IP地址传递给name而不是主机名,QHostInfo将为IP地址搜索域名(即,QHostInfo将执行反向查询)。成功时,结果的QHostInfo将包含解析后的域名和主机名的IP地址。

  • 参数说明:

    • 参数 name 是表示主机名的字符串,可以是一个主机名、一个域名或者是一个IP地址
    • 参数 receiver 指定了一个响应槽函数的接收者
    • 参数 member 指定了一个响应槽函数的槽函数名称
  • 示例:

    QHostInfo::lookupHost("www.kde.org", this, SLOT(lookedUp(QHostInfo)));
    
    void MyWidget::lookedUp(const QHostInfo &host)
    {
        if (host.error() != QHostInfo::NoError) {
            qDebug() << "Lookup failed:" << host.errorString();
            return;
        }
    
        const auto addresses = host.addresses();
        for (const QHostAddress &address : addresses)
            qDebug() << "Found address:" << address.toString();
    }
    

执行 lookupHost() 函数后,程序可能需要花一定的时间来查找主机地址,但是不会阻塞程序的运行。当查找到主机地址后,通过信号通知设定的槽函数,在槽函数里读取查找的结果。函数返回一个表示查找的 ID。

程序如下:

void Dialog::on_btnLookup_clicked()
{//查找主机信息
    QString hostname=ui->editHost->text(); //主机名
    ui->plainTextEdit->appendPlainText("正在查找查找主机信息:"+hostname);
    QHostInfo::lookupHost(hostname,this,SLOT(lookedUpHostInfo(QHostInfo)));
}

void Dialog::lookedUpHostInfo(const QHostInfo &host)
{//查找主机信息的槽函数
//    ui->plainTextEdit->clear();
    QList<QHostAddress> addList=host.addresses();//
    if (!addList.isEmpty())
    for (int i=0;i<addList.count();i++)
    {
        QHostAddress aHost=addList.at(i);
        bool show=ui->chkOnlyIPv4->isChecked();//只显示IPv4
        if (show)
            show=QAbstractSocket::IPv4Protocol==aHost.protocol();
        else
            show=true;

        if (show) {
            ui->plainTextEdit->appendPlainText("协 议:"+protocolName(aHost.protocol()));
            ui->plainTextEdit->appendPlainText(aHost.toString());
        }
    }
}

  单击 “QHostInfo 查找域名的 IP 地址” 按钮,

image-20240730113457690

3.QNetworkInterface 的使用

  QNetworklnterface 可以获得运行应用程序的主机的所有网络接口,包括其子网掩码和广播地址等。静态函数 QNetworklnterface::allInterfaces() 函数用于获取所有网络接口的列表,通过 humanReadableName() 函数获取网络接口名称。通过 hardwareAddress() 函数获取 MAC 地址。通过 addressEntries() 函数获取当前网络接口的 IP 地址列表(包括子网掩码与广播地址)。这个 IP 地址列表是 QNetworkAddressEntry 类型的地址列表。QNetworkAddressEntry类提供了一个网络接口的 IP 地址、子网掩码和广播地址,有三个主要的函数:

  • ip() 函数

    返回网络接口的 IP 地址

  • netmask() 函数

    返回网络接口的子网掩码

  • broadcast() 函数

    返回网络接口的广播地址

  如果无需直到子网掩码和广播地址等信息,可以使用 QNetworklnterface::allAddress() 只获取 IP 地址。QNetworklnterface::allAddress() 的功能与 QHostInfo::addresses() 函数类似,都是返回一个 QHostAddress 的列表。只是 QNetworklnterface 会返回更多的地址,包括表示本机的 127.0.0.1,而 QHostInfo 不会返回这个 IP 地址。

程序如下:

void Dialog::on_btnALLInterface_clicked()
{//QNetworkInterface::allInterfaces()函数的使用
//    ui->plainTextEdit->clear();

    QList<QNetworkInterface>    list=QNetworkInterface::allInterfaces();
    for(int i=0;i<list.count();i++)
    {
        QNetworkInterface aInterface=list.at(i);
        if (!aInterface.isValid())
           continue;

        ui->plainTextEdit->appendPlainText("设备名称:"+aInterface.humanReadableName());
        ui->plainTextEdit->appendPlainText("硬件地址:"+aInterface.hardwareAddress());
        QList<QNetworkAddressEntry> entryList=aInterface.addressEntries();
        for(int j=0;j<entryList.count();j++)
        {
            QNetworkAddressEntry aEntry=entryList.at(j);
            ui->plainTextEdit->appendPlainText("   IP 地址:"+aEntry.ip().toString());
            ui->plainTextEdit->appendPlainText("   子网掩码:"+aEntry.netmask().toString());
            ui->plainTextEdit->appendPlainText("   广播地址:"+aEntry.broadcast().toString()+"\n");
        }
        ui->plainTextEdit->appendPlainText("\n");
    }
}

  单击 “QNetworkInterface::allInterfaces()”

image-20240730115123279

程序如下:

void Dialog::on_btnDetail_clicked()
{//QNetworkInterface::allAddresses()的使用
//    ui->plainTextEdit->clear();

    QList<QHostAddress> addList=QNetworkInterface::allAddresses();//
    if (!addList.isEmpty())
    for (int i=0;i<addList.count();i++)
    {
        QHostAddress aHost=addList.at(i);
        bool show=ui->chkOnlyIPv4->isChecked();//只显示IPv4
        if (show)
            show=QAbstractSocket::IPv4Protocol==aHost.protocol();
        else
            show=true;

        if (show)
        {
        ui->plainTextEdit->appendPlainText("协  议:"+protocolName(aHost.protocol()));
        ui->plainTextEdit->appendPlainText("IP地址:"+aHost.toString());
        ui->plainTextEdit->appendPlainText("");
        }
    }
}

  单击 “QNetworklnterface::allAddress()”,

image-20240730115351106

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

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

相关文章

线上语音交友平台成熟案例源码出售本地找搭子交友app软件线下陪玩系统开发服务

1、上麦相亲互动:直播间内除了红娘外&#xff0c;还有男女用户两个视频麦位&#xff0c;直播间符合要求的用户可以申请上麦, 2、公屏聊天:为上麦用户可以通过在公屏发言的方式参与直播间内的话题互动。 3、私信异性用户之间可以发送私信消息&#xff0c;通过付要或开通会员可解…

【获取Jmeter中正则获取的数据】

获取参数值保存在本地 Jmeter获取参数保存本地【三步走策略】【一】正则表达式提取器【二】BeanShell 后置处理程序【三】执行看结果 Jmeter获取参数保存本地【三步走策略】 节省人工成本之获取参数值保存本地 【一】正则表达式提取器 【二】BeanShell 后置处理程序 FileWri…

2023年中医药市场深度剖析:政策引领,创新驱动,迈向黄金发展期!

中医药作为中国传统文化的重要组成部分&#xff0c;在现代医学体系中占据着独特的地位。本文基于《药融咨询》发布的《中药行业现状与未来趋势白皮书》&#xff0c;深入分析了中医药行业的发展现状、政策环境、市场情况、研发进展及未来发展趋势&#xff0c;旨在为行业内外的读…

【Hot100】LeetCode—5. 最长回文子串

目录 题目1- 思路2- 实现⭐5. 最长回文子串——题解思路 3- ACM 实现 题目 原题连接&#xff1a;5. 最长回文子串 1- 思路 模式识别&#xff1a;最长回文子串——> 动规五部曲子串的概念 ——> 子串是连续的部分&#xff0c;区别与子序列 动规五部曲 1.定义dp数组 dp…

网络模型的使用以及修改 pytorch

VGG16_Weights.DEFAULT 或 VGG16_Weights.IMAGENET1K_V1&#xff1a;使用在 ImageNet 上训练的权重 import torchvision from torch import nnvgg16_false torchvision.models.vgg16() vgg16_true torchvision.models.vgg16(weightsDEFAULT) print(vgg16_true) train_data …

vue3项目结构梳理:

总览 1.vscode文件&#xff1a; 通常用于存放Visual Studio Code编辑器的插件的配置 2.node_moudles文件夹&#xff1a; 这个文件夹包含了项目所需的所有npm依赖包。&#xff08;需要在根目录下执行npm i命令安装这个文件夹&#xff09; 或者在项目根目录&#xff08;packa…

深度学习论文: SAM 2: Segment Anything in Images and Videos

深度学习论文: SAM 2: Segment Anything in Images and Videos SAM 2: Segment Anything in Images and Videos PDF:https://ai.meta.com/research/publications/sam-2-segment-anything-in-images-and-videos/ PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks …

前端开发不得不知道的那些事

文章目录 一、技能提升篇vueuseJavaScript中文网JavaScript.infoRxJsWeb安全学习书栈网码农之家 二、UI篇iconfont&#xff1a;阿里巴巴矢量图标库IconPark3dicons美叶UndrawError 404摹克 三、CSS篇You-need-to-know-cssCSS TricksAnimate.cssCSS ScanCSS Filter 四、颜色篇中…

滑模变结构控制仿真实例(s-function代码详解)

目录 一、建立系统数学模型二、控制器设计1. 设计滑模面(切换面)2.设计控制器 u3. 稳定性证明 三、 Matlab 仿真1. s-function 模型2. 主要代码3. 仿真结果(采用符号函数sign(s))4. 仿真结果(采用饱和函数sat(s)) 一、建立系统数学模型 { x ˙ 1 x 2 x ˙ 2 x 3 x ˙ 3 x 1 …

vue3中Cesium离线地图

最近的需求需要在vue3发布Cesium离线地图&#xff0c;之前openlayers我是在本地开启http server发布的地址可以使用&#xff0c;但是Cesium会报跨域错误&#xff0c;在网上查了一下&#xff0c;后用的是nginx代理&#xff0c;下面我记录一下自己的方法。 1.判断是否联网 expo…

Linux、Windows、Mac 系统安装 Nginx 及配置命令全攻略

一、Linux 系统安装 Nginx 及配置 &#xff08;一&#xff09;安装依赖包 在 Linux 系统中安装 Nginx 前&#xff0c;首先需要安装依赖包。以下是常见的依赖包安装命令&#xff1a; yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 若安装过程中出现错…

力扣高频SQL 50题(基础版)第三十二题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第三十二题1789.员工的直属部门题目说明实现过程准备数据实现方式结果截图 力扣高频SQL 50题&#xff08;基础版&#xff09;第三十二题 1789.员工的直属部门 题目说明 表&#xff1a;Employee ------------------…

Yolov8训练时正常,但验证时Cuda out of memory问题的解决方案(非完全解决)

【问题描述】 在Yolov8训练时&#xff0c;训练中正常&#xff0c;但每轮训练中做验证时报错Cuda out of memory&#xff1a; 【解决方案】 往下翻有具体的报错信息&#xff1a; 可知是显存爆了。在没有条件更换训练显卡的情况下&#xff0c;笔者尝试增加with torch.no_grad…

TiDB Hackathon 2024丨用 TiDB 构建未来的 AI 创新应用, 瓜分超 ¥210,000 奖金池!

2024 TiDB Future App Hackathon 来啦&#xff01;这是第八届 TiDB Hackathon&#xff0c;TiDB Hackathon 自举办以来&#xff0c;已累计参赛人数超过 3000 人 &#xff01;回顾去年的 TiDB Hackathon 赛事&#xff0c;有来自 88 个国家近 1500 名小伙伴参加&#xff0c;提交了…

IDEA某个项目被同事提交的代码导致不能进入Debug了,不是IDEA的问题。千万要避坑!

刚开始我发现突然不能进入debug了&#xff0c;打上去后就立马边灰了&#xff0c;我以为是我IDEA的问题&#xff0c;后来我换了其他项目都能正常进入debug. 而且后续&#xff0c;这个项目的其他同事也都不能进入debug了。 我就怀疑是项目中有人提交了代码导致的。 后来查…

必备插件自取 vue3.0 在vscode提升编码效率

一些vue开发中用到的插件&#xff0c;抽空总结一下&#xff0c;一是方便自己查看&#xff0c;另外是供其他需要的同学参考。在开发vue项目中&#xff0c;无论用什么编辑器一些好用的插件对我们来讲或许是必要的&#xff0c;因为好的插件既能方便我们编码&#xff0c;又能提升开…

文件解析漏洞--IIS--Vulhub

文件解析漏洞 一、IIS解析漏洞 用windowserver2003安装IIS测试 1.1 IIS6.X 方法一&#xff1a;目录解析 在网站下建立文件夹的名字为.asp/.asa的文件夹&#xff0c;其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行。 1.txt文件里是asp文件的语法查看当前时间 方…

PSO求解函数最小值的MATLAB例程|MATLAB源代码

本篇文章适合PSO入门&#xff0c;进阶的可能会觉得太简单的。 目录 PSO例程作用运行结果代码函数解释 例程修改tips PSO Particle Swarm Optimization&#xff0c;粒子群优化算法&#xff0c;通过模拟鸟群或鱼群的行为来寻找最优解。在计算时通过对一群粒子的位置和速度进行迭…

Stable Diffusion Windows本地部署超详细教程(手动+自动+整合包三种方式)

2022年作为AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;时代的元年&#xff0c;各个领域的AIGC技术都有一个迅猛的发展&#xff0c;给工业界、学术界、投资界甚至竞赛界都注入了新的“AI活力”与“AI势能”。 其中在AI绘画领域&#xff0c;Stable D…

内部类练习题

代码&#xff1a; public static void main(String[] args) {A anew A();a.f(); } class A{private String name"A";public void f(){class B{private String name"B";public void show(){System.out.println("A姓名为&#xff1a;"A.this.name…