简述
Qt中提供了几个用于获取主机网络信息的类,包括:QHostInfo、QHostAddress、QNetworkInterface以及QNetworkAddress。
QHostInfo类提供了一系列用于主机名查询的静态函数。
QHostInfo利用操作系统提供的查询机制来查询与特定主机名相关联的主机的IP地址,或者与一个IP地址相关联的主机名。这个类提供了两个静态的便利函数:一个以异步方式工作,一旦找到主机就发射一个信号;另一个以阻塞方式工作,并且最终返回一个QHostInfo对象。
要使用异步方式查询主机的IP地址,调用lookupHost()即可,该函数包含3个参数,依次是主机名/IP地址、接收的对象、接收的槽函数,并返回一个查询ID。可以通过调用以查询ID为参数的abortHostLookup()方法的来中止查询。
当获得查询结果后就会调用槽函数。查询结果被存储到QHostInfo对象中。可通过调用addresses()方法来获得主机的IP地址列表,同时可通过调用hostName()方法来获得查询的主机名。
如果查询失败,error()返回发生错误的类型,errorString()返回一个能够读懂的查询错误描述。
获取本机主机名
QString strLocalHostName = QHostInfo::localHostName();
qDebug() << "Local Host Name:" << strLocalHostName;
输出结果:
Local Host Name:”Wang-PC”
异步方式
获取IP
QHostInfo::lookupHost("qt-project.org", this, SLOT(lookedUp(QHostInfo)));
void MainWindow::lookedUp(const QHostInfo &host)
{
if (host.error() != QHostInfo::NoError) {
qDebug() << "Lookup failed:" << host.errorString();
return;
}
foreach (const QHostAddress &address, host.addresses()) {
// 输出IPV4、IPv6地址
if (address.protocol() == QAbstractSocket::IPv4Protocol)
qDebug() << "Found IPv4 address:" << address.toString();
else if (address.protocol() == QAbstractSocket::IPv6Protocol)
qDebug() << "Found IPv6 address:" << address.toString();
else
qDebug() << "Found other address:" << address.toString();
}
}
输出结果:
Found IPv4 address: “5.254.113.102”
Found IPv4 address: “178.32.152.214”
获取主机名
QHostInfo::lookupHost("5.254.113.102", this, SLOT(lookedUp(QHostInfo)));
void MainWindow::lookedUp(const QHostInfo &host)
{
if (host.error() != QHostInfo::NoError) {
qDebug() << "Lookup failed:" << host.errorString();
return;
}
qDebug() << "Found hostName:" << host.hostName();
}
输出结果:
Found hostName: “webredirects.cloudns.net”
阻塞方式
QHostInfo host = QHostInfo::fromName("5.254.113.102");
if (host.error() != QHostInfo::NoError) {
qDebug() << "Lookup failed:" << host.errorString();
return;
}
qDebug() << "Found hostName:" << host.hostName();
输出结果:
Found hostName: “webredirects.cloudns.net”
错误处理
如上所述,查询失败,可以通过error()返回的错误类型HostInfoError来判断,其包含三个值:
常量 | 值 | 描述 |
---|---|---|
QHostInfo::NoError | 0 | 查找成功 |
QHostInfo::HostNotFound | 1 | 没有发现主机对应的IP地址 |
QHostInfo::UnknownError | 2 | 未知错误 |