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

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

前置环境

运行环境: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.本机网络信息获取

cpp 复制代码
#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

cpp 复制代码
#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)

相关推荐
半盏茶香几秒前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
Evand J1 小时前
LOS/NLOS环境建模与三维TOA定位,MATLAB仿真程序,可自定义锚点数量和轨迹点长度
开发语言·matlab
LucianaiB1 小时前
探索CSDN博客数据:使用Python爬虫技术
开发语言·爬虫·python
Ronin3051 小时前
11.vector的介绍及模拟实现
开发语言·c++
计算机学长大白2 小时前
C中设计不允许继承的类的实现方法是什么?
c语言·开发语言
PieroPc3 小时前
Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
开发语言·python·excel
2401_857439695 小时前
SSM 架构下 Vue 电脑测评系统:为电脑性能评估赋能
开发语言·php
SoraLuna6 小时前
「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台
开发语言·macos·ui·华为·harmonyos
xlsw_6 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
Dream_Snowar7 小时前
速通Python 第三节
开发语言·python