首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

Qt 網絡編程:QNetworkAddressEntry 解析 IP 地址詳情

     編輯:C++ 入門

類職責

QNetworkAddressEntry 封裝網絡接口上的單個 IP 地址及其關聯的子網掩碼和廣播地址。每個 QNetworkInterface 可包含多個此類條目(如一張網卡配置多個 IP)。

核心成員函數

函數返回類型說明
ip()QHostAddressIP 地址(IPv4/IPv6)
netmask()QHostAddress子網掩碼,用於劃分網絡/主機位
broadcast()QHostAddress廣播地址,發送到同一子網所有主機

典型使用場景

遍歷接口下所有地址條目

auto interfaces = QNetworkInterface::allInterfaces();
for (const auto &iface : interfaces) {
    qDebug() << "Interface:" << iface.name();
    for (const auto &entry : iface.addressEntries()) {
        qDebug() << "  IP:" << entry.ip().toString();
        qDebug() << "  Netmask:" << entry.netmask().toString();
        qDebug() << "  Broadcast:" << entry.broadcast().toString();
    }
}

計算網段範圍

利用 IP 與掩碼按位與運算得網絡地址,與反掩碼或運算得廣播地址(Qt 已在 broadcast() 提供)。

QHostAddress ip = entry.ip();
QHostAddress mask = entry.netmask();
QHostAddress network(ip.toIPv4Address() & mask.toIPv4Address()); // 僅 IPv4 示例
qDebug() << "Network:" << network.toString();

判斷兩 IP 是否同一子網

bool sameSubnet(const QHostAddress &a, const QHostAddress &b, const QHostAddress &mask) {
    return (a.toIPv4Address() & mask.toIPv4Address()) == (b.toIPv4Address() & mask.toIPv4Address());
}

IPv6 特殊處理

  • IPv6 無傳統廣播,使用多播替代,broadcast() 可能返回空或鏈路本地全節點多播 (ff02::1)。
  • 前綴長度(/64 等)替代子網掩碼,netmask() 返回對應掩碼地址。
  • 鏈路本地地址(fe80::%)需結合接口索引使用,QHostAddress::scopeId() 獲取。

常見問題

  • 掩碼為空:某些系統/接口不報告掩碼,需兜底默認值(IPv4 常用 255.255.255.0)。
  • 廣播為空:點對點鏈路、IPv6 接口無廣播地址。
  • 多條目順序:無保證順序,業務邏輯不應依賴順序。

總結

QNetworkAddressEntry 是 Qt 網絡層解析 IP 配置詳情的關鍵類,配合 QNetworkInterface::addressEntries() 可獲取完整的接口地址拓撲。掌握其三大核心屬性及 IPv4/IPv6 差異,能輕鬆實現子網判斷、網段掃描、廣播發送等網絡工程常見功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved