当前位置: 首页 > news >正文

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

文章目录

  • 一、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); //每一项是一个QHostAddressbool show=ui->chkOnlyIPv4->isChecked();//只显示IPv4if (show)show=(QAbstractSocket::IPv4Protocol==aHost.protocol()); //协议类型,elseshow=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();//只显示IPv4if (show)show=QAbstractSocket::IPv4Protocol==aHost.protocol();elseshow=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();//只显示IPv4if (show)show=QAbstractSocket::IPv4Protocol==aHost.protocol();elseshow=true;if (show){ui->plainTextEdit->appendPlainText("协  议:"+protocolName(aHost.protocol()));ui->plainTextEdit->appendPlainText("IP地址:"+aHost.toString());ui->plainTextEdit->appendPlainText("");}}
}

  单击 “QNetworklnterface::allAddress()”,

image-20240730115351106

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • React Native在移动端落地实践
  • 《动手做科研 》| 03. 如何阅读人工智能研究论文
  • matlab 小数取余 rem 和 mod有 bug
  • 需求跟踪矩阵:项目管理的“指南针”
  • C++ STL accumulate 用法
  • 2024西安铁一中集训DAY26 ---- 模拟赛(最短路 + 实数域二分 + 线段树 + 并查集(平面图欧拉定理))
  • C端与B端 - 第一弹 - 理解和区分C端与B端软件开发
  • vardaccico前端私有库
  • Loadrunner12常用函数
  • MATLAB画散点密度图(附代码和测试数据的压缩包)
  • 14.FineReport制作带筛选按钮的报表和图表
  • Golang | Leetcode Golang题解之第295题数据流的中位数
  • 编程语言「描述符」漫谈——以C++与Rust为例的行为声明与类型描述
  • 【Go - mongodb - bson / schema】
  • mcasttest-tool组播检测工具
  • @angular/forms 源码解析之双向绑定
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【个人向】《HTTP图解》阅后小结
  • es的写入过程
  • httpie使用详解
  • javascript 哈希表
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 产品三维模型在线预览
  • 从PHP迁移至Golang - 基础篇
  • 从tcpdump抓包看TCP/IP协议
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 嵌入式文件系统
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 异常机制详解
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • ​secrets --- 生成管理密码的安全随机数​
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #pragma 指令
  • (1)STL算法之遍历容器
  • (java)关于Thread的挂起和恢复
  • (js)循环条件满足时终止循环
  • (补)B+树一些思想
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (十) 初识 Docker file
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)ABI是什么
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .aanva
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net core使用ef 6
  • .NET Framework杂记
  • .NET Micro Framework初体验(二)