Qt 网络编程 网络信息获取操作

news2024/9/24 7:14:04

学习目标:网络信息获取操作

前置环境

运行环境:qt creator 4.12

学习内容

一、Qt 网络编程基础

  1. Qt 直接提供了网络编程模块,包括基于 TCP/IP 的客户端和服务器相关类,如 QTcpSocket/QTcpServer 和 QUdpSocket,以及实现 HTTP、FTP 等协议的高级类,如 QNetworkRequest/QNetworkAccessManager。
  2. Qt 网络编程模块还提供了基于安全套接字层协议(SSL)的安全网络通信类。
  3. 开发过程中需要在项目配置文件中添加 QT += network 以引入网络模块。
  4. QHostInfo 类提供了查询主机名、IP 地址、DNS 域名等信息的静态函数。
  5. QNetworkInterface 类用于获取主机所有 IP 地址和网络接口列表信息

QHostInfo类提供了一些常用的成员函数,用于获取主机名和IP地址等信息。以下是一些常用的成员函数:

  1. QHostInfo.localHostName(): 返回当前主机的主机名。
  2. QHostInfo.localDomainName(): 返回当前主机的域名。
  3. QHostInfo.addresses(): 返回与主机名关联的所有IP地址列表。
  4. QHostInfo.lookupHost(const QString &hostname, QObject *receiver, const char *member): 异步查找指定主机名对应的IP地址列表,当查找完成时会发送一个finished()信号。
  5. QHostInfo::fromName(const QString &name): 同步查找指定主机名对应的IP地址列表,返回一个QHostInfo对象。
  6. QHostInfo.error(): 返回最近一次查找操作中发生的错误。
  7. QHostInfo.errorString(): 返回最近一次查找操作中发生的错误描述。
  8. QHostInfo.addLookup(const QString &hostname): 添加一个新的主机名查找任务。
  9. QHostInfo.cancelAllLookups(): 取消所有正在进行的主机名查找任务。  

QNetworkInterface是Qt中用于获取网络接口信息的类,它提供了以下一些常用的成员函数:

  1. QList<QNetworkInterface> allInterfaces(): 返回系统中所有可用的网络接口列表。

  2. QList<QNetworkAddressEntry> addressEntries(): 返回当前网络接口的所有IP地址条目。

  3. QString name(): 返回网络接口的名称。

  4. QString humanReadableName(): 返回更加易读的网络接口名称。

  5. QNetworkInterface::InterfaceFlags flags(): 返回网络接口的标志位,用于表示接口的状态和特性。

  6. quint16 index(): 返回网络接口的索引号。

  7. QNetworkAddressEntry address(): 返回网络接口的主IP地址。

  8. QList<QNetworkAddressEntry> allAddresses(): 返回网络接口的所有IP地址条目。

  9. quint64 hardwareAddress(): 返回网络接口的MAC地址。

  10. bool isValid(): 检查网络接口是否有效。

  11. bool isLoopBack(): 检查网络接口是否为回环接口。

  12. bool isPointToPoint(): 检查网络接口是否为点对点连接。

实现项目

1.通过域名查询对方主机ip

这里出现两个ip是因为百度进行了ip转发

2.本机网络信息获取 

Qt获取网络信息编程

1.本机网络信息获取

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

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


void Dialog::on_pushButton_2_clicked() //获取ip/主机名称
{
    QString localname = QHostInfo::localHostName();
    ui->lineEdit->setText(localname);
    QHostInfo info = QHostInfo::fromName(localname);
    QList<QHostAddress> ipaddr = info.addresses();
    foreach(const QHostAddress& addr,ipaddr)
    {
        if(addr.protocol() == QAbstractSocket::IPv4Protocol){
            qDebug()<<"IPv4 address:"<<addr.toString();
            ui->lineEdit_2->setText(addr.toString());
        }else if(addr.protocol() == QAbstractSocket::IPv6Protocol){
            qDebug()<<"IPv6 address:"<<addr.toString();
        }
    }

}

void Dialog::on_pushButton_clicked() //获取详细信息
{

    //枚举所有的网络接口,然后获取每个接口的IP地址条目,同样区分IPv4和IPv6地址进行输出。
    QList<QNetworkInterface> netinterface = QNetworkInterface::allInterfaces();
    QString result;
    for (int i=0;i<netinterface.size();i++) { //遍历所有网络接口
        QNetworkInterface interface=netinterface.at(i);
        result+="设备名称:"+interface.name()+"\n";      // 返回网络接口的名称,如"以太网"或"WLAN"等。
        result+="硬件地址:"+interface.hardwareAddress()+"\n";   //获取当前网络接口的硬件地址(MAC地址),
        //从当前网络接口获取所有的地址条目列表。 QNetworkAddressEntry 表示一个IP地址条目,包含IP地址、子网掩码和广播地址等信息。
        QList<QNetworkAddressEntry> entrylist = interface.addressEntries();
        for (int k=0;k<entrylist.size();k++) {
            QNetworkAddressEntry etry =entrylist.at(k);
            result+="Ip地址:"+etry.ip().toString()+"\n";
            result+="子网掩码:"+etry.netmask().toString()+"\n";
            result+="广播地址:"+etry.broadcast().toString()+"\n";

        }
    }
    qDebug()<<"网卡接口全部信息:"<<result;
    QTextEdit *set =new QTextEdit(result,this);
    ui->verticalLayout_3->addWidget(set);
}

 2.通过域名查询对方主机ip

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

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


void Dialog::on_pushButton_2_clicked() //查询dns
{
    QString name =ui->lineEdit->text();
    ui->plainTextEdit->appendPlainText("正在查询的主机信息:"+name);
    QHostInfo info =QHostInfo::fromName(name);
    QList<QHostAddress> addrs = info.addresses();
    for (int i=0;i<addrs.size();i++) {
        QHostAddress addr =addrs.at(i);
        QString proto;
        switch (addr.protocol()) {
            case QAbstractSocket::IPv4Protocol:
                    proto+= "IPv4 Protocol";break;
            case QAbstractSocket::IPv6Protocol:
                 proto+= "IPv6 Protocol";break;
            case QAbstractSocket::AnyIPProtocol:
                 proto+= "Any IP Protocol";break;
            default:
                 proto+= "Unknown Network Layer Protocol";
        }
        ui->plainTextEdit->appendPlainText("协议类型:"+proto);
        ui->plainTextEdit->appendPlainText("主机IP地址: "+addr.toString());
    }

}

void Dialog::on_pushButton_clicked() //清空
{
    ui->plainTextEdit->clear();
}

 总结

计算机ip信息获取,主要通过name 交由QhostInfo,然后通过info 获取addr等信息,之后遍历ip表即可获得。      

最后附上源代码链接
对您有帮助的话,帮忙点个star

32-networkinfo · jbjnb/Qt demo - 码云 - 开源中国 (gitee.com)

33-dns-netinfo · jbjnb/Qt demo - 码云 - 开源中国 (gitee.com)

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

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

相关文章

flask缓存、信号的使用

【 一 】flask-ache ​ 它为 Flask 应用程序提供了缓存支持。缓存是 Web 应用程序中非常常见的做法&#xff0c;用于存储频繁访问但不太可能经常更改的数据&#xff0c;以减少对数据库或其他慢速存储系统的访问&#xff0c;从而提高应用程序的性能和响应速度。 ​ Flask-Cach…

程序员必知的 89 个操作系统核心概念

1. 操作系统&#xff08;Operating System&#xff0c;OS&#xff09;&#xff1a;是管理计算机硬件与软件资源的系统软件&#xff0c;同时也是计算机系统的内核与基石。操作系统需要处理管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系…

Stable Diffusion 【模型推荐】没有最强,只有更强!高清画质!电影光效版SD1.5人像摄影大模型《他和她 2》

今天带来了一款SD1.5大模型——《他和她 2》电影光效版SD1.5人像摄影大模型。该模型经过家叔马丁Mr_M大佬的优化升级后&#xff0c;把SD1.5的影像光效推上了全新的高度&#xff01;根据大佬的描述&#xff0c;该模型具有更强大的细节表现&#xff0c;更细腻的表面肌理&#xff…

揭秘SmartEDA:电路仿真软件如何贯穿课前课中课后,助力电子学习新纪元!

在电子设计与自动化的学习道路上&#xff0c;一款强大的电路仿真软件往往能为学生们带来事半功倍的效果。今天&#xff0c;我们就来深入探讨一下SmartEDA这款电路仿真软件在课前、课中、课后的全方位应用&#xff0c;看看它如何助力我们的电子学习步入新纪元&#xff01; 1、课…

水果商城系统 SpringBoot+Vue

1、技术栈 技术栈&#xff1a;SpringBootVueMybatis等使用环境&#xff1a;Windows10 谷歌浏览器开发环境&#xff1a;jdk1.8 Maven mysql Idea 数据库仅供学习参考 【已经答辩过的毕业设计】 项目源码地址 2、功能划分 3、效果演示

下载安装JavaFX及解决报错:缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序|Eclipse

目录 1.下载并解压 2.Eclipse配置 3.报错问题 解决方法1&#xff1a;将javaSE更改到9以下 解决方法2&#xff1a; 使用module-info.java配置解决 1.下载并解压 JavaFX下载地址&#xff1a;JavaFX - Gluon 选择合适自己电脑配置的sdk版本下载 打不开网页的参考这个博客&…

泛微开发修炼之旅--35关于基于页面扩展和自定义按钮实现与后端交互调用的方法

文章链接&#xff1a;35关于基于页面扩展和自定义按钮实现与后端交互调用的方法

【手写数据库内核组件】0201 哈希表hashtable的实战演练,多种非加密算法,hash桶的冲突处理,查找插入删除操作的代码实现

hash表原理与实战 ​专栏内容&#xff1a; postgresql使用入门基础手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 文章目录 hash表…

如果国产BI工具也有顶流,它们一定会上榜

在数据驱动的今天&#xff0c;商业智能&#xff08;BI&#xff09;工具已成为企业不可或缺的助手&#xff0c;它们通过强大的数据处理和分析能力&#xff0c;帮助企业洞察市场趋势&#xff0c;优化运营决策。如果BI工具界也有“顶流”&#xff0c;那么奥威BI、帆软BI&#xff0…

世优科技获新锐商业价值奖,数字人阿央入选北京市元宇宙“名人”

2024全球经济大会元宇宙创新发展论坛暨2024第九届“创客中国”元宇宙中小企业创新创业大赛&#xff0c;由工业和信息化部网络安全产业发展中心、北京市经济和信息化局、石景山区人民政府、首钢集团有限公司主办&#xff0c;围绕元宇宙底层技术端和产业应用端两个方向&#xff0…

ROS2 分布式 及 ssh远程控制 和 上传下载文件或文件夹

问题1. 多台计算机连接同一wifi后 &#xff0c;运行ROS2的小乌龟案例&#xff0c;自己的计算机&#xff0c;无法控制其他电脑的小乌龟 按照正常的情况来说&#xff0c;ROS2是DDS的自发现通信机制&#xff0c;只要处在同一wifi网络中&#xff0c; A计算机执行启动小乌龟的命…

计算机网络-组播分发树与组播协议

一、组播分发树 前面我们大致了解了下组播的转发原理&#xff0c;通过RPF反向路径检查可以形成无环的组播转发路径&#xff0c;今天继续学习下组播分发树和组播协议。 组播数据转发需要保证转发路径无环&#xff0c;无次优路径且无重复包。通过RPF机制与组播路由协议&#xff0…

【撤稿资讯】国家杰青被撤稿23篇文章,主要原因图片重复使用等

本周投稿推荐 SCI • 能源科学类&#xff0c;1.5-2.0&#xff08;来稿即录25天&#xff09; • 计算机类&#xff0c;2.0-3.0&#xff08;纯正刊29天录用&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; 知网 • 7天录用-检索&#xff08;急录友好&a…

论文图片模糊怎么办?科研绘图小track解决你的困扰

论文图片模糊怎么办&#xff1f;科研绘图小track解决你的困扰 一、 使用draw.io 绘图二、使用在线压缩工具&#xff0c;尽可能的无损压缩(推荐迅捷图片转换器)三、当然你也可以用svg 一、 使用draw.io 绘图 网址&#xff1a;https://draw.io/ 解决方法&#xff1a; 加大图片的分…

延时双删两种实现对比分析

前言 延时双删&#xff08;Delayed Double Deletion&#xff09;是一种在分布式系统或缓存一致性处理中使用的技术&#xff0c;目的是确保缓存与数据库之间的数据一致性。它主要用于处理在高并发情况下&#xff0c;缓存和数据库可能出现的数据不一致问题。 常见更新策略的问题…

5分钟微课视频制作方法 微课录制后期制作方法

微课视频是一种短小精悍的在线教育视频形式&#xff0c;通常时长在5到10分钟左右&#xff0c;观众可以在短暂的时间内获取到有用的信息。微课视频的目的是通过简洁明了的内容&#xff0c;向观众传递特定的知识点或技能&#xff0c;它的特点在于紧凑、便于消化和分享&#xff0c…

ESP32CAM物联网教学10

ESP32CAM物联网教学10 MicroPython 应用体验 小智偶然地发现&#xff0c;有一种新兴的编程模式MicroPython&#xff0c;也能编写ESP32Cam的应用程序了&#xff0c;于是欣然地体验了一把。 编程环境搭建 小智偶然地从下面这家店铺买了一块ESP32Cam&#xff0c;并从客服那里得到…

【人工智能】-- 智能家居

个人主页&#xff1a;欢迎来到 Papicatch的博客 课设专栏 &#xff1a;学生成绩管理系统 专业知识专栏&#xff1a; 专业知识 文章目录 &#x1f349;引言 &#x1f349;基于深度卷积神经网络的表情识别 &#x1f348;流程图 &#x1f348;模型设计 &#x1f34d;网络架…

安全防御(防火墙)

第二天&#xff1a; 1.恶意程序---一般会具有一下多个或则全部特点 1.非法性&#xff1a;你未经授权它自动运行或者自动下载的&#xff0c;这都属于非法的。那恶意程序一般它会具有这种特点&#xff0c; 2.隐蔽性&#xff1a;一般隐藏的会比较深&#xff0c;目的就是为了防止…

UML建模工具Draw.io简介

新书速览|《UML 2.5基础、建模与设计实践 Draw.io是一个非常出色的免费、开源、简洁、方便的绘图软件&#xff0c;利用这款软件可以绘制出生动有趣的图形&#xff0c;包括流程图、地图、网络架构图、UML用例图、流程图等。它支持各种快捷键&#xff0c;免费提供了1000多张画图…