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)

相关推荐
用户8055336980314 小时前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner14 小时前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz6 天前
QML Hello World 入门示例
qt
xcyxiner9 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner9 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner10 天前
DicomViewer (添加模型类)3
qt
xcyxiner10 天前
DicomViewer (目录调整) 2
qt
xcyxiner10 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00612 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术12 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript