主机信息查询
查询一个主机的 MAC 地址或 IP 地址是网络应用程序中经常用到的功能,Qt 提供了 QHostInfo 和 QNetworkInterface 类可以用于此类信息的查询。
QHostInfo
QHostInfo 类用于获取主机相关的信息,例如主机名、IP地址和域名。
- 同步获取本地主机名、IP 地址列表
QString name = QHostInfo::localHostName();
qDebug() << name;
QHostInfo info = QHostInfo::fromName(name);
auto addresses = info.addresses();
for (auto &address : addresses) {
// 获取其中的 IPv4 地址
if (address.protocol() == QAbstractSocket::IPv4Protocol) {
qDebug() << address.toString();
}
}
输出结果:
"BmSeven"
"192.168.0.202"
"192.168.192.1"
"192.168.46.1"
"172.31.32.1"
举例:获取本机 IP 地址
QString name = QHostInfo::localHostName();
qDebug() << name;
QHostInfo info = QHostInfo::fromName(name);
auto addresses = info.addresses();
for (auto &address : addresses) {
// 一个主机名获取的 IP 地址可能不止一个,不过第一个一般是本机设定的 IP 地址
if (address != QHostAddress::LocalHost && address.toIPv4Address()) {
qDebug() << address.toString();
break;
}
}
- 异步获取主机信息(lookupHost())
需要制定一个主机名、一个 QObject 指针和一个槽。该函数可以执行名称查找,完成后会调用指定的 QObject 对象的槽,查找工作是在其他线程中进行的,即异步运行。
// 私有槽
private slots:
void lookUp(const QHsotInfo &host);
// 定义
void Widget::lookedUp(const QHostInfo &host)
{
if (host.error() != QHostInfo::NoError) {
qDebug() << "Lookup failed: " << host.errorString();
return;
}
for (auto &address : host.addresses()) {
qDebug() << address.toString();
}
}
// 构造函数中调用
int id = QHostInfo::lookupHost("www.baidu.com", this, SLOT(lookedUp(QHostInfo)));
qDebug() << id;
输出结果:
1
"180.101.50.242"
"180.101.50.188"
QNetworkInterface
QNetworkInterface 类用于获取设备的网络接口信息,包括接口名称、硬件地址、IP地址等。
QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();
for (auto &interface : interfaces) {
// 接口名称
qDebug() << "interface name: " << interface.name();
// 硬件地址
qDebug() << "hardware address: " << interface.hardwareAddress();
// 获取 IP 地址条目列表,每个条目包含一个 IP 地址、子网掩码和广播地址
QList<QNetworkAddressEntry> entryList = interface.addressEntries();
for (auto &entry : entryList) {
// IP
qDebug() << "IP Address: " << entry.ip().toString();
// 子网掩码
qDebug() << "Netmask: " << entry.netmask().toString();
// 广播地址
qDebug() << "Broadcast: " << entry.broadcast().toString();
}
qDebug() << "************************";
}
输出结果:
interface name: "ethernet_32769"
hardware address: "18:31:BF:C8:60:DA"
IP Address: "fe80::542e:531a:8074:4df1%ethernet_32769"
Netmask: "ffff:ffff:ffff:ffff::"
Broadcast: ""
IP Address: "192.168.0.202"
Netmask: "255.255.255.0"
Broadcast: "192.168.0.255"
************************
interface name: "ethernet_32770"
hardware address: "00:50:56:C0:00:01"
IP Address: "fe80::384b:137c:62ae:d585%ethernet_32770"
Netmask: "ffff:ffff:ffff:ffff::"
Broadcast: ""
IP Address: "192.168.46.1"
Netmask: "255.255.255.0"
Broadcast: "192.168.46.255"
************************
interface name: "ethernet_32771"
hardware address: "00:50:56:C0:00:08"
IP Address: "fe80::8784:dd05:ed61:2b6%ethernet_32771"
Netmask: "ffff:ffff:ffff:ffff::"
Broadcast: ""
IP Address: "192.168.192.1"
Netmask: "255.255.255.0"
Broadcast: "192.168.192.255"
************************
interface name: "loopback_0"
hardware address: ""
IP Address: "::1"
Netmask: "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"
Broadcast: ""
IP Address: "127.0.0.1"
Netmask: "255.0.0.0"
Broadcast: "127.255.255.255"
************************
interface name: "ethernet_32776"
hardware address: "00:15:5D:B1:B7:0D"
IP Address: "fe80::564e:303e:b869:d1a4%ethernet_32776"
Netmask: "ffff:ffff:ffff:ffff::"
Broadcast: ""
IP Address: "172.31.32.1"
Netmask: "255.255.240.0"
Broadcast: "172.31.47.255"
************************
总结
QHsotInfo 主要关注主机名、域名和 IP 地址等主机相关的信息,适用于解析主机信息的场景。
QNetworkInterface 主要关注设备上的网络接口,提供了详细的接口信息,适用于获取设备网络配置的场景。