欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

XIV.Qt 主机信息和网络编程 - I. 主机信息

最编程 2024-03-03 12:50:09
...

1、主机信息接口

  • QHostInfo:获取主机名称和IP地址
  • QNetWorkInterface:获取主机的所有网络接口,包括子网掩码和广播地址等

(1)使用

项目添加模块
QT       += network

2、实现程序

在这里插入图片描述

(1)创建项目,基于QDialog

在这里插入图片描述

(2)实现功能

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

#include <QHostInfo>
#include <QNetworkInterface>

namespace Ui
{
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

private:
    QString protocolName(QAbstractSocket::NetworkLayerProtocol protocol);

public:
    explicit Dialog(QWidget *parent = nullptr);
    ~Dialog();

private slots:
    void on_btnHostIP_clicked();

    void on_btnClearText_clicked();

    void on_btnDnsIP_clicked();

    void on_lookUpHostInfo(QHostInfo host);

    void on_btnAllAddresses_clicked();

    void on_btnAllInterface_clicked();

private:
    Ui::Dialog *ui;
};

#endif // DIALOG_H
#include "dialog.h"
#include "ui_dialog.h"



QString Dialog::protocolName(QAbstractSocket::NetworkLayerProtocol protocol)
{
    switch (protocol)
    {
    case QAbstractSocket::IPv4Protocol:
        return "IPv4 Protocol";
        break;
    case QAbstractSocket::IPv6Protocol:
        return "IPv6 Protocol";
        break;
    case QAbstractSocket::AnyIPProtocol:
        return "AnyIP Protocol";
        break;
    default:
        return "Unknown Protocol";
        break;
    }
}

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

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

void Dialog::on_btnHostIP_clicked()
{
    QString hostName = QHostInfo::localHostName();
    ui->plainTextEdit->appendPlainText(hostName);

    QHostInfo hostInfo = QHostInfo::fromName(hostName);
    QList<QHostAddress> addList = hostInfo.addresses();
    foreach (auto aHost, addList)
    {
        if(ui->checkBox->isChecked())
        {
            if(aHost.protocol() == QAbstractSocket::IPv4Protocol)
            {
                ui->plainTextEdit->appendPlainText("协议:" + protocolName(aHost.protocol()));
                ui->plainTextEdit->appendPlainText("本机IP地址:" + aHost.toString());
                ui->plainTextEdit->appendPlainText("");
            }
        }
        else
        {
            ui->plainTextEdit->appendPlainText("协议:" + protocolName(aHost.protocol()));
            ui->plainTextEdit->appendPlainText("本机IP地址:" + aHost.toString());
            ui->plainTextEdit->appendPlainText("");
        }
    }
}

void Dialog::on_btnClearText_clicked()
{
    ui->plainTextEdit->clear();
}

void Dialog::on_btnDnsIP_clicked()
{
    // 异步方式
    QString hostName = ui->lineEdit->text();
    ui->plainTextEdit->appendPlainText("正在查询主机信息:" + hostName);
    QHostInfo::lookupHost(hostName, this, SLOT(on_lookUpHostInfo(QHostInfo)));
}

void Dialog::on_lookUpHostInfo(QHostInfo host)
{
    QList<QHostAddress> addList = host.addresses();
    foreach (auto aHost, addList)
    {
        if(ui->checkBox->isChecked())
        {
            if(aHost.protocol() == QAbstractSocket::IPv4Protocol)
            {
                ui->plainTextEdit->appendPlainText("协议:" + protocolName(aHost.protocol()));
                ui->plainTextEdit->appendPlainText("IP地址:" + aHost.toString());
                ui->plainTextEdit->appendPlainText("");
            }
        }
        else
        {
            ui->plainTextEdit->appendPlainText("协议:" + protocolName(aHost.protocol()));
            ui->plainTextEdit->appendPlainText("IP地址:" + aHost.toString());
            ui->plainTextEdit->appendPlainText("");
        }
    }
}

void Dialog::on_btnAllAddresses_clicked()
{
    QList<QHostAddress> addList = QNetworkInterface::allAddresses();
    foreach (auto aHost, addList)
    {
        if(ui->checkBox->isChecked())
        {
            if(aHost.protocol() == QAbstractSocket::IPv4Protocol)
            {
                ui->plainTextEdit->appendPlainText("协议:" + protocolName(aHost.protocol()));
                ui->plainTextEdit->appendPlainText("IP地址:" + aHost.toString());
                ui->plainTextEdit->appendPlainText("");
            }
        }
        else
        {
            ui->plainTextEdit->appendPlainText("协议:" + protocolName(aHost.protocol()));
            ui->plainTextEdit->appendPlainText("IP地址:" + aHost.toString());
            ui->plainTextEdit->appendPlainText("");
        }
    }
}

void Dialog::on_btnAllInterface_clicked()
{
    QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
    foreach (auto aInterface, list)
    {
        if(!aInterface.isValid())
        {
            continue;
        }
        ui->plainTextEdit->appendPlainText("设备名称: " + aInterface.humanReadableName());
        ui->plainTextEdit->appendPlainText("硬件地址: " + aInterface.hardwareAddress());
        QList<QNetworkAddressEntry> entryList = aInterface.addressEntries();
        foreach (auto aEntry, entryList)
        {
            ui->plainTextEdit->appendPlainText("  IP地址: " + aEntry.ip().toString());
            ui->plainTextEdit->appendPlainText("  子网掩码: " + aEntry.netmask().toString());
            ui->plainTextEdit->appendPlainText("  广播地址: " + aEntry.broadcast().toString());
        }
        ui->plainTextEdit->appendPlainText("");
    }
}

在这里插入图片描述

推荐阅读