C++ Qt開發:QNetworkInterface網路介面元件

lyshark發表於2024-03-09

Qt 是一個跨平臺C++圖形介面開發庫,利用Qt可以快速開發跨平臺窗體應用程式,在Qt中我們可以透過拖拽的方式將不同元件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹如何運用QNetworkInterface元件實現查詢詳細的網路介面引數。

在Qt網路程式設計中,QNetworkInterface是一個強大的類,提供了獲取本地網路介面資訊的能力。透過QNetworkInterface,可以輕鬆地獲取有關網路介面的資訊,包括介面的名稱、硬體地址、IP地址和子網掩碼等。這個類對於需要獲取本地網路環境資訊的應用程式特別有用,例如網路配置工具、網路監控程式等。QNetworkInterface透過提供一致而易於使用的介面,使得網路程式設計中的任務更加簡便和可靠。

以下是QNetworkInterface類的一些常用函式的解釋:

函式 描述
static QList<QNetworkInterface> allInterfaces() 返回系統中所有可用的網路介面列表。
static QNetworkInterface interfaceFromName(const QString &name) 根據給定名稱返回對應的網路介面。
static QList<QNetworkInterface> allAddresses() 返回系統中所有網路介面的IP地址列表。
QString name() const 返回網路介面的名稱。
QNetworkInterface::InterfaceType type() const 返回網路介面的型別。
bool isValid() const 判斷網路介面是否有效。
QNetworkAddressEntry addressEntryAt(int index) const 返回索引位置的網路介面地址。
QList<QNetworkAddressEntry> addressEntries() const 返回網路介面的地址列表。
QNetworkAddressEntry addressEntry() const 返回首選網路介面地址,如果沒有地址則返回空的QNetworkAddressEntry物件。
QNetworkInterface::HardwareAddress macAddress() const 返回網路介面的硬體地址(MAC地址)。
bool isLoopBack() const 判斷網路介面是否是迴環介面。
bool isPointToPoint() const 判斷網路介面是否是點對點連線。
bool supportsMulticast() const 判斷網路介面是否支援多播。
bool operator==(const QNetworkInterface &other) const 判斷兩個網路介面是否相等。
bool operator!=(const QNetworkInterface &other) const 判斷兩個網路介面是否不相等。
QList<QNetworkInterface> allInterfaces(QNetworkInterface::InterfaceType type) 返回指定型別的所有網路介面列表。

QNetworkInterface類提供了豐富的功能,用於獲取和處理系統中的網路介面資訊。透過這些函式,可以輕鬆地檢索有關網路介面的各種詳細資訊,為網路程式設計提供了便捷的工具。

網路卡的查詢非常容易實現,只需要呼叫通用介面QNetworkInterface::allInterfaces()即可,該函式可以直接返回指定型別的所有網路介面列表。

在解析IP地址時還需要使用QNetworkAddressEntry類,QNetworkAddressEntry是用於表示網路介面地址資訊的類。它包含了IP地址、子網掩碼、廣播地址以及字首長度等關鍵資訊,為處理網路配置和操作提供了便捷的工具。透過QNetworkAddressEntry可以輕鬆地獲取和設定網路介面的各種地址屬性,用於網路程式設計中的介面配置和資訊查詢。

以下是QNetworkAddressEntry類的一些常用函式和描述:

函式 描述
QNetworkAddressEntry() 預設建構函式,建立一個空的QNetworkAddressEntry物件。
QNetworkAddressEntry(const QNetworkAddressEntry &other) 複製建構函式,根據給定的other物件建立一個新的物件。
QNetworkAddressEntry &operator=(const QNetworkAddressEntry &other) 賦值運算子,將other物件的值賦給當前物件。
void setIp(const QHostAddress &address) 設定IP地址。
QHostAddress ip() const 返回IP地址。
void setNetmask(const QHostAddress &netmask) 設定子網掩碼。
QHostAddress netmask() const 返回子網掩碼。
void setBroadcast(const QHostAddress &broadcast) 設定廣播地址。
QHostAddress broadcast() const 返回廣播地址。
void setPrefixLength(int length) 設定字首長度。
int prefixLength() const 返回字首長度。
void clear() 清空QNetworkAddressEntry物件,重置為初始狀態。

透過使用aInterface.addressEntries()我們可直接讀入IP地址列表,並將其放入到QNetworkAddressEntry內儲存,透過*.count()得到網路卡總數量,並呼叫at()得到我們所需要的地址,最後就能夠透過aEntry.ip().*的方式遍歷出所有的地址資訊,程式碼如下所示;

void MainWindow::on_pushButton_clicked()
{
    QList<QNetworkInterface> list=QNetworkInterface::allInterfaces();
    for(int i=0;i<list.count();i++)
    {
        QNetworkInterface aInterface=list.at(i);
        if (!aInterface.isValid())
           continue;

        ui->plainTextEdit->appendPlainText("裝置名稱:"+aInterface.humanReadableName());
        ui->plainTextEdit->appendPlainText("硬體地址:"+aInterface.hardwareAddress());
        QList<QNetworkAddressEntry> entryList=aInterface.addressEntries();
        for(int j=0;j<entryList.count();j++)
        {
            QNetworkAddressEntry aEntry=entryList.at(j);
            ui->plainTextEdit->appendPlainText("IP 地址:"+aEntry.ip().toString());
            ui->plainTextEdit->appendPlainText("子網掩碼:"+aEntry.netmask().toString());
            ui->plainTextEdit->appendPlainText("廣播地址:"+aEntry.broadcast().toString());
        }

        ui->plainTextEdit->appendPlainText(" ------------------------------------------- ");
        ui->plainTextEdit->appendPlainText("\n");
    }
}

執行後點選查詢網路卡資訊,可得到完整的本機網路卡,如下圖;

相關文章