QT 网络编程之主机信息查询(QHostInfo 和 QNetworkInterface类)简介

news2024/11/27 15:46:20

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

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

1、QHostInfo 和 QNetworkInterface 类

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

QHostInfo 的静态函数 localHostName()可获取本机的主机名,静态函数 fromName()可以通过主机名获取IP 地址,静态函数 lookupHost()可以通过一个主机名,以异步方式查找这个主机的IP地址。下表是QHostInfo 类主要的功能函数(省略了函数中的const 关键字)。

类别

函数原型

作用

公共函数

QList<QHostAddress> addresses()

HostInfoError error()

QString errorString()

QString hostName()

int lookupld()

返回与 hostname()主机关联的IP 地址列表

如果主机查找失败,返回失败类型

如果主机查找失败,返回错误描述字符串

返回通过 IP查找的主机的名称

返回本次查找的ID

静态函数

void abortHostLookup(int id)

QHostInfo fromName(QString &name)

QString localDomainName()

QString localHostName()

int lookupHost(QString&name,

QObiect*receiver,char *member)

中断主机查找

返回指定的主机名的IP 地址

返回本机DNS域名

返回本机主机名

以异步方式根据主机名查找主机的 IP 地址,并返回一个表示本次查找的ID,可用于 abortHostLookup()

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

类别

函数原型

作用

公共函数

QList<QNetworkAddressEntry> addressEntries()

OString hardwareAddress()

QString humanReadableName()

bool isValid()

QString name()

返回该网络接口(包括子网掩码和广播地址)的IP 地址列表

返回该接口的低级硬件地址,以太网里就是 MAC 地址

返回可以读懂的接口名称,如果名称不确定,得到的就是name()函数的返回值

如果接口信息有效就返回 true

返回网络接口名称

静态函数

QList<QHostAddress> allAddresses()

QList<QNetworkInterface> allInterfaces()

返回主机上所有 IP 地址的列表

返回主机上所有接口的网络列表

为演示这两个类的主要功能,创建一个窗口基于 QDialog 的应用程序实例运行时界面如下图所示。对话框界面由 UI设计器设计,主要代码都是各按钮的 clicked()信号的槽函数。

窗口上的“QHostInf 取本机主机名和I地址”按的响应代码如下:

void HostDialog::on_btnGetHostInfo_clicked()
{
    QString hostName = QHostInfo::localHostName();
    ui->textInfo->appendPlainText(("本机主机名称:") + hostName + "\n" );
    QHostInfo hostInfo = QHostInfo::fromName(hostName);
    QList<QHostAddress> addList = hostInfo.addresses();
    if(addList.isEmpty())
    {
        return;
    }
    for(int i = 0; i < addList.count(); i++)
    {
        QHostAddress host = addList.at(i);
        bool show = ui->chkOnlyIPv4->isChecked();
        if(show)
        {
            show = (QAbstractSocket::IPv4Protocol == host.protocol());
        }
        else{
            show = true;
        }
        if(show)
        {
            ui->textInfo->appendPlainText("协议:" + protocolName(host.protocol()));
            ui->textInfo->appendPlainText("本机IP地址:" + host.toString());
            ui->textInfo->appendPlainText("");
        }

    }
}

 查找主机地址信息

QHostInfo 的静态函数 lokupHost()可以根据主机名、域名或 IP 地址查找主机的地址信息lookupHost()函数原型如下:
int QHostInfo::lookupHost(const QString &name, QObject *receiver, const char *member)

输入参数 name 是表示主机名的字符串,可以是一个主机名、一个域名,或者是一个IP 地址lookupHost()以异步方式查找主机地址,参数 receiver 和 member 指定一个响应槽函数的接收者和槽函数名称。执行 lookupHost()后,程序可能需要花一定时间来查找主机地址,但不会阻塞程序的运行。当查找到主机地址后,通过信号通知设定的槽函数,在槽函数里读取查找的结果。函数返回一个表示查找的ID。
窗口“OHostInfo 查找域名的IP 地址”按的槽函数及 lokupHost()函数关联槽函数代码如下:

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

void HostDialog::lookedUpHostInfo(const QHostInfo &host)
{
    QList<QHostAddress> addList = host.addresses();
    if(addList.isEmpty())
    {
        return;
    }
    for(int i = 0; i < addList.count(); i++)
    {
        QHostAddress aHost = addList.at(i);
        bool show = ui->chkOnlyIPv4->isChecked();
        if(show)
        {
            show = QAbstractSocket::IPv4Protocol == aHost.protocol();
        }
        else{
            show = true;
        }
        if(show)
        {
            ui->textInfo->appendPlainText("协议:" + protocolName(aHost.protocol()));
            ui->textInfo->appendPlainText(aHost.toString());
        }
    }
}

QNetworkInterface 可以获得应用程序所在主机的所有网络接口,包括其子网码和广播地址等静态函数QNetworkInterface::allInterfaces()获取所有网络接口的列表,函数原型为:

QList<QNetworkInterface> QNetworkInterface::allInterfaces()

其返回结果是一个QNetworkInterface 类的列表。界面上“QNetworkInterface::allInterfaces()”按钮的响应代码如下:

void HostDialog::on_btnAllInterfaces_clicked()
{
    QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
    for(int i = 0; i < list.count(); i++)
    {
        QNetworkInterface interface = list.at(i);
        if(!interface.isValid())
        {
            continue;
        }
        ui->textInfo->appendPlainText("设备名称:" + interface.humanReadableName());
        ui->textInfo->appendPlainText("硬件地址:" + interface.hardwareAddress());
        QList<QNetworkAddressEntry> entryList = interface.addressEntries();
        for(int j = 0; j < entryList.count(); j++)
        {
            QNetworkAddressEntry entry = entryList.at(j);
            ui->textInfo->appendPlainText("IP 地址:" + entry.ip().toString());
            ui->textInfo->appendPlainText("子网掩码:" + entry.netmask().toString());
            ui->textInfo->appendPlainText("广播地址:" + entry.broadcast().toString() + "\n");
            ui->textInfo->appendPlainText("\n");
        }
    }
}

通过QNetworkInterface::allInterfaces()获取网络接口列表 list之后,显示每个接口的humanReadableName()和 hardwareAddress()。每个接口又有一个 QNetworkAddressEntry 类型的地址列表,通过addressEntries()获得这个列表。

QNetworkAddressEntry 包含了一个网络接口的IP 地址、子网掩码和广播地址,分别用ip(),netmask()和 broadcast()函数返回。

QNetworkInterface::allInterfaces()返回的网络接口的信息很多,如果无需知道子网掩码和广播地址等信息,可以使用QNetworkInterface::allAddresses()只获取IP 地址界面上“QNetworkInterface ::allAddresses()”按钮的响应代码如下:

void HostDialog::on_btnAllAddressed_clicked()
{
    QList<QHostAddress> addList = QNetworkInterface::allAddresses();
    if(addList.isEmpty())
    {
        return;
    }
    for(int i = 0; i < addList.count(); i++)
    {
        QHostAddress info = addList.at(i);
        bool show = ui->chkOnlyIPv4->isChecked();
        if(show)
        {
            show = QAbstractSocket::IPv4Protocol == info.protocol();
        }
        else
        {
            show = true;
        }
        if(show)
        {
            ui->textInfo->appendPlainText("协议:" + protocolName(info.protocol()));
            ui->textInfo->appendPlainText("IP地址:" + info.toString());
            ui->textInfo->appendPlainText("");
        }
    }
}

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

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

相关文章

【Redis】Redis中的5种基础数据类型详解

文章目录 1. Redis数据结构2. 基础数据结构详解2.1 String字符串2.2 List列表2.3 Set集合2.4 Hash散列2.5 Zset有序集合 1. Redis数据结构 对于Redis来说&#xff0c;所有的key&#xff08;键&#xff09;都是字符串&#xff0c;我们一般所讨论的Redis基础数据类型指的是存储的…

ref在Vue2、Vue3中的使用

文章目录 前言一、ref在Vue2中的用法二、ref在Vue3中的用法 前言 记录一下ref在Vue2与Vue3中的使用&#xff0c;ref可以获取DOM元素&#xff0c;也可以获取子组件的数据、方法。 一、ref在Vue2中的用法 给元素绑定一个ref&#xff0c;然后在js中通过this.$refs获取DOM。 ref命…

@PostConstruct注解和@PreDestroy注解

前言 Bean注解指定初始化和销毁的方法&#xff0c;也介绍了使用InitializingBean和DisposableBean来处理bean的初始化和销毁。JDK中还提供了两个注解能够在bean创建完成并且属性赋值完成之后执行一些初始化工作和在容器销毁bean之前通知我们进行一些清理工作。 1.PostConstru…

java 获取当前线程的方法

我们知道&#xff0c;线程是程序运行的基本单元&#xff0c;是程序中各进程之间通信的桥梁&#xff0c;一个线程的创建和销毁直接影响整个程序的运行效率。 我们在 Java中经常使用 Runnable接口来获取当前线程&#xff0c;获取线程的主要目的就是为了快速地启动进程。但是&…

一键导出ChatGPT聊天记录:让备份更简单

重要性&#xff1a; 备份ChatGPT的聊天记录同样非常重要&#xff0c;因为这些记录可能包含了您与ChatGPT的交互记录&#xff0c;这些记录可能包含了您的个人信息、兴趣爱好、偏好和其他敏感信息。以下是备份ChatGPT聊天记录的一些重要性&#xff1a; 防止数据丢失&#xff1a;…

FT2000+ qemu kvm 64C64G 通过频繁设置CPU online 状态导致虚拟机红旗操作系统假死测试用例

宿主机配置 虚拟机配置文件 <domain typekvm> //如果是Xen&#xff0c;则type‘xen’<name>redflag1</name> //虚拟机名称&#xff0c;同一物理机唯一<uuid>44748c15-7c00-4817-8724-675a27c3f821</uuid> //同一物理机唯一&#xff0c;可用uu…

北京 Meetup 预告 | 内含六个话题,满满干货,期待见面!

在春之末尾&#xff0c;夏之开始的5月&#xff0c;响应社区小伙伴们的呼唤&#xff0c;我们泽拓科技将在北京举办线下社区技术交流活动。 此次我们泽拓科技邀请了去哪儿网、ScaleFlux、美团、SphereEx的相关资深专家来分享他们的数据库探索与实践。我们真诚邀请数据库技术社区…

Day3_Springboot框架搭建

前面两天介绍了vue前端的主体框架&#xff0c;并完成了相关页面的部分设置&#xff0c;接下来开始介绍springboot后端开发的过程&#xff0c;手把手实践。包括项目的初始构建以及集成mybatis、mybatis-plus实现增删改查&#xff0c;分页查询&#xff0c;集成swagger-ui测试&…

Spring(4) Spring是如何使用三级缓存来解决循环依赖问题?

目录 1.什么是循环依赖&#xff1f;2.什么是Spring的循环依赖&#xff1f;3.三级缓存解决循环依赖3.1 假如只使用一级缓存3.2 假如使用二级缓存3.3 为什么要使用三级缓存 4.三级缓存解决循环依赖的局限性 1.什么是循环依赖&#xff1f; 假设我们有两个类 A 和 B&#xff0c;类…

【Docker】1、认识 Docker 和安装 Docker

目录 零、项目部署问题一、Docker 简介二、Docker 和虚拟机三、镜像和容器四、Docker 架构五、CentOS7 上安装 Docker(1) 卸载曾经安装过的 Docker(2) 安装 Docker(3) 启动 Docker(4) 启动、关闭、重启 Docker 六、配置 Docker 镜像国内仓库 零、项目部署问题 大型项目组件较多…

爬虫(requsets)笔记

1、request_基本使用 pip install requests -i https://pypi.douban.com/simple 一个类型六个属性 r.text 获取网站源码 r.encoding 访问或定制编码方式r.url 获取请求的urlr.content 响应的字节类型r.status_code 响应的状态码r.headers 响应的头信息 import requestsurl…

VS2022汇编环境搭建

VS2022汇编环境搭建 使用VS2022搭建汇编语言运行环境Step 1 安装VS2022Step 2 创建项目 使用VS2022搭建汇编语言运行环境 使用Visual Studio 2022 搭建汇编语言项目&#xff0c;运行汇编语言代码。 Step 1 安装VS2022 自行到官网下载安装&#xff0c;选择C编程环境。 Step…

【RabbitMQ】| Lion带你 (超详细) 从0到1使用SpringBoot操作RabbitMQ

目录 一. &#x1f981; 前言二. &#x1f981; SpringBoot操作RabbitMQⅠ. 前期准备工作1. 创建项目&#xff08;不细说&#xff09;2. 添加依赖3. 编写配置文件 Ⅱ. 创建队列和交换机Ⅲ. 创建生产者Ⅳ. 创建消费者 三. &#x1f981; 总结 一. &#x1f981; 前言 Spring Bo…

Spring MVC开发及使用(8000字详解)

如何学习 Spring MVC&#xff1f; 学习 SPring MVC 只需要掌握以下三个功能&#xff1a; 连接的功能&#xff1a;将用户&#xff08;浏览器&#xff09;和 Java 程序连接起来&#xff0c;也就是访问一个地址能够调用到我们 Spring程序&#xff1b;获取参数的功能&#xff1a;用…

颜色空间转换RGB-YCbCr

颜色空间 RGB、YUV和YCbCr都是人为规定的彩色模型或颜色空间&#xff08;有时也叫彩色系统或彩色空间&#xff09;。它的用途是在某些标准下用通常可接受的方式对彩色加以说明。本质上&#xff0c;彩色模型是坐标系统和子空间的阐述。 YCbCr与RGB的相互转换 RGB->YCbCr Y …

2023五一杯数学建模竞赛ABC题思路解析+代码+论文

AB题见文末&#xff0c;下面是C C题&#xff1a;“双碳”目标下低碳建筑研究 “双碳”即碳达峰与碳中和的简称&#xff0c;我国力争2030年前实现碳达峰&#xff0c;2060年前实现碳中和。“双碳”战略倡导绿色、环保、低碳的生活方式。我国加快降低碳排放步伐&#xff0c;大力推…

金陵科技学院五年一贯制专转本电路分析考试大纲

金陵科技学院五年一贯制专转本电路分析考试大纲 专业名称&#xff1a;自动化 考试科目&#xff1a;专业基础课 一、考试要求 掌握电路分析的基本概念、基本原理和基本方法&#xff0c;提高分析电路的思维能力与计算能力&#xff0c;以便为学习后继课程奠定必要的基础。 二…

R 安装函数包及绘制图形

R语言绘制简单条形图 一、载入数据1.安装函数包2.导入文件3.读取数据&#xff08;.csv文件&#xff09; 二、绘制图形绘制简单条形图 一、载入数据 1.安装函数包 在控制台console输入命令&#xff1a; install.packages("bruceR")查看是否安装成功 library(bruce…

【二】MATLAB矩阵处理

【二】MATLAB矩阵处理 1 常用的特殊矩阵函数 zeros函数&#xff1a; zeros(m):产生mm零矩阵 zeros(m,n):产生mn零矩阵 zeros(size(A)):产生与矩阵A相同大小的零矩阵 ones函数&#xff1a; 产生4阶全1矩阵 ones(4) eye函数&#xff1a; 产生对角线为1的矩阵&#xff0c…

分享随机数和唯一ID的工具类

随机数一般也是会被常使用到的&#xff0c;比如在造一些模拟测试数据的场景&#xff0c;或者说是非高端应用的场景会被使用。而全局唯一ID的使用则相反&#xff0c;应用场景更广&#xff0c;更专业&#xff0c;更科学&#xff0c;比如在批量保存数据时&#xff0c;需要提前生成…