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

Qt5 獲取本機網絡信息:IP、主機名、MAC、子網掩碼、廣播地址

     編輯:關於C

Qt5 QNetworkInterface、QHostInfo、QHostAddress 提供跨平台網絡信息查詢 API。本文封裝實用工具函數,獲取主機名、首選 IPv4 地址、所有網卡 MAC/名稱、每個 IP 對應的子網掩碼與廣播地址,附完整代碼與調試輸出示例。

1. 獲取主機名

QString getLocalMachineName() {
    return QHostInfo::localHostName();
}

2. 獲取首選 IPv4 地址(非回環)

QString getLocalMachineIP() {
    QString ipAddress;
    QList list = QNetworkInterface::allAddresses();
    for (const QHostAddress &addr : list) {
        if (addr != QHostAddress::LocalHost && addr.protocol() == QAbstractSocket::IPv4Protocol) {
            ipAddress = addr.toString();
            break;
        }
    }
    if (ipAddress.isEmpty())
        ipAddress = QHostAddress(QHostAddress::LocalHost).toString();
    return ipAddress;
}

3. 獲取所有網卡名稱與 MAC 地址

void getLocalMachineMAC() {
    QList nets = QNetworkInterface::allInterfaces();
    for (const QNetworkInterface &ni : nets) {
        qDebug() << "Interface:" << ni.name()
                 << "Human:" << ni.humanReadableName()
                 << "MAC:" << ni.hardwareAddress();
    }
}

4. 獲取每個 IP 的子網掩碼與廣播地址

void getNetmaskAndBroadcast() {
    QList nets = QNetworkInterface::allInterfaces();
    for (const QNetworkInterface &ni : nets) {
        QList entries = ni.addressEntries();
        for (const QNetworkAddressEntry &entry : entries) {
            qDebug() << "IP:" << entry.ip().toString()
                     << "Netmask:" << entry.netmask().toString()
                     << "Broadcast:" << entry.broadcast().toString();
        }
    }
}

完整調用示例

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    qDebug() << "=== Hostname ===" << getLocalMachineName();
    qDebug() << "=== Primary IPv4 ===" << getLocalMachineIP();
    qDebug() << "=== All Interfaces & MAC ===";
    getLocalMachineMAC();
    qDebug() << "=== Netmask & Broadcast ===";
    getNetmaskAndBroadcast();

    return 0;
}

典型調試輸出

=== Hostname === "MyPC"
=== Primary IPv4 === "192.168.1.100"
=== All Interfaces & MAC ===
Interface: "lo" Human: "Loopback" MAC: "00:00:00:00:00:00"
Interface: "eth0" Human: "Realtek PCIe GBE" MAC: "00:11:22:33:44:55"
Interface: "wlan0" Human: "Intel Wireless" MAC: "AA:BB:CC:DD:EE:FF"
=== Netmask & Broadcast ===
IP: "127.0.0.1" Netmask: "255.0.0.0" Broadcast: "127.255.255.255"
IP: "192.168.1.100" Netmask: "255.255.255.0" Broadcast: "192.168.1.255"
IP: "10.0.0.5" Netmask: "255.255.255.0" Broadcast: "10.0.0.255"

關鍵類與方法速查

類關鍵方法用途
QHostInfolocalHostName(), fromName()主機名解析
QNetworkInterfaceallInterfaces(), addressEntries(), hardwareAddress()網卡枚舉、MAC、IP條目
QNetworkAddressEntryip(), netmask(), broadcast()單個 IP 的掩碼/廣播
QHostAddresstoString(), protocol(), isLoopback()IP 地址封裝與判斷

常見問題與對策

  • 多網卡選擇:遍歷 allInterfaces(),根據 flags() 過濾 IsUp | IsRunning | !IsLoopBack,優先有線網卡。
  • 權限不足:Linux 下讀取 MAC 需 root 或 CAP_NET_RAW,普通用戶可能返回空。
  • IPv6 支持:protocol() == IPv6Protocol 同理處理,掩碼為前綴長度。
  • 虛擬網卡干擾:Docker/VMware 虛擬網卡會出現在列表,需按名稱/標誌過濾。

總結

Qt5 網絡信息 API 設計清晰:QNetworkInterface 為核心入口,枚舉網卡 → addressEntries() 獲取 IP 條目 → 每條目含 ip/netmask/broadcast。封裝上述工具函數,即可滿足「顯示本機 IP」「綁定特定網卡」「計算廣播地址發送廣播包」等常見需求。

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