天天看点

Qt QNetworkInterface详解1.QNetworkInterface简介2.示例

1.QNetworkInterface简介

QNetworkInterface可以获得应用程序所在主机的所有网络接口,包括子网掩码和广播地址等。

主要静态方法

  • QList<QHostAddress> allAddresses():返回主机上所有Ip地址的列表。
  • QList<QNetworkInterface> allInterfaces():返回主机上所有接口的网络列表。

成员方法

  • QString hardwareAddress():返回该接口的低级硬件地址,以太网里就是MAC地址。
  • QString humanReadableName():返回可以读懂的接口名称,如果名称不确定,得到的就是name函数的返回值。
  • QString name():返回网络接口名称。
  • bool isValid():如果接口信息有效就返回true。

2.示例

返回主机上所有网络接口,包括子网掩码和广播地址,主机的ip地址了列表

Qt QNetworkInterface详解1.QNetworkInterface简介2.示例
//.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QNetworkInterface>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    QString protocolName(QAbstractSocket::NetworkLayerProtocol protocol);

private slots:
    void on_btnAddr_clicked();

    void on_btnInterFace_clicked();

    void on_btnClear_clicked();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H
           
//.cpp
#include "widget.h"
#include "ui_widget.h"

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

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

QString Widget::protocolName(QAbstractSocket::NetworkLayerProtocol protocol)
{

    switch (protocol)
    {
    case QAbstractSocket::IPv4Protocol:
        return "IPv4 Protocol";
    case QAbstractSocket::IPv6Protocol:
        return "IPv6 Protocol";
    case QAbstractSocket::AnyIPProtocol:
        return "Any IP Protocol";
    default:
        return "Unknown Network Layer Protocol";
    }
}
void Widget::on_btnAddr_clicked()
{
    QList<QHostAddress> addList = QNetworkInterface::allAddresses();
    for(int i=0;i<addList.count();i++)
    {
        QHostAddress host = addList.at(i);
        ui->plainTextEdit->appendPlainText("协议: "+ protocolName(host.protocol()));
        ui->plainTextEdit->appendPlainText("IP地址: "+ host.toString());
        ui->plainTextEdit->appendPlainText("");
    }
}

void Widget::on_btnInterFace_clicked()
{
    QList<QNetworkInterface> ifList = QNetworkInterface::allInterfaces();
    for(int i=0;i<ifList.count();i++)
    {
        QNetworkInterface inf = ifList.at(i);
        if(!inf.isValid())
            continue;
        ui->plainTextEdit->appendPlainText("设备名称: "+inf.humanReadableName());
        ui->plainTextEdit->appendPlainText("硬件地址: "+inf.hardwareAddress());

        QList<QNetworkAddressEntry> entryList = inf.addressEntries();
        for(int j=0;j<entryList.count();j++)
        {
            QNetworkAddressEntry entry = entryList.at(j);
            ui->plainTextEdit->appendPlainText("IP地址: "+entry.ip().toString());
            ui->plainTextEdit->appendPlainText("子网掩码: "+entry.netmask().toString());
            ui->plainTextEdit->appendPlainText("广播地址: "+entry.broadcast().toString() + "\n");
        }
        ui->plainTextEdit->appendPlainText("\n");
    }
}

void Widget::on_btnClear_clicked()
{
    ui->plainTextEdit->clear();
}