Qt5 QNetworkInterface、QHostInfo、QHostAddress 提供跨平台網絡信息查詢 API。本文封裝實用工具函數,獲取主機名、首選 IPv4 地址、所有網卡 MAC/名稱、每個 IP 對應的子網掩碼與廣播地址,附完整代碼與調試輸出示例。
QString getLocalMachineName() {
return QHostInfo::localHostName();
}
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;
}
void getLocalMachineMAC() {
QList nets = QNetworkInterface::allInterfaces();
for (const QNetworkInterface &ni : nets) {
qDebug() << "Interface:" << ni.name()
<< "Human:" << ni.humanReadableName()
<< "MAC:" << ni.hardwareAddress();
}
}
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"
| 類 | 關鍵方法 | 用途 |
|---|---|---|
QHostInfo | localHostName(), fromName() | 主機名解析 |
QNetworkInterface | allInterfaces(), addressEntries(), hardwareAddress() | 網卡枚舉、MAC、IP條目 |
QNetworkAddressEntry | ip(), netmask(), broadcast() | 單個 IP 的掩碼/廣播 |
QHostAddress | toString(), protocol(), isLoopback() | IP 地址封裝與判斷 |
allInterfaces(),根據 flags() 過濾 IsUp | IsRunning | !IsLoopBack,優先有線網卡。CAP_NET_RAW,普通用戶可能返回空。protocol() == IPv6Protocol 同理處理,掩碼為前綴長度。Qt5 網絡信息 API 設計清晰:QNetworkInterface 為核心入口,枚舉網卡 → addressEntries() 獲取 IP 條目 → 每條目含 ip/netmask/broadcast。封裝上述工具函數,即可滿足「顯示本機 IP」「綁定特定網卡」「計算廣播地址發送廣播包」等常見需求。