Qt之QHostInfo
2016-03-01 18:48
399 查看
简述
QHostInfo 类为主机名查找提供了静态函数。QHostInfo 利用操作系统提供的查询机制来查询与特定主机名相关联的主机的 IP 地址,或者与一个IP地址相关联的主机名。这个类提供了两个静态的便利函数:一个以异步方式工作,一旦找到主机就发射一个信号;另一个以阻塞方式工作,并且最终返回一个 QHostInfo 对象。
要使用异步方式查询主机的 IP 地址,调用 lookupHost() 即可,该函数包含 3 个参数,依次是:主机名/ IP 地址、接收的对象、接收的槽函数,并返回一个查询ID。以查询ID为参数,通过调用 abortHostLookup() 函数的来中止查询。
当获得查询结果后就会调用槽函数,查询结果被存储到 QHostInfo 对象中。可通过调用 addresses() 函数来获得主机的 IP 地址列表,同时可通过调用 hostName() 函数来获得查询的主机名。
简述
查询本机主机名
查询主机信息
异步方式
阻塞方式
中止查询
错误处理
更多参考
查询本机主机名
QString strLocalHostName = QHostInfo::localHostName(); qDebug() << "Local Host Name:" << strLocalHostName;
输出结果:
Local Host Name:”Wang-PC”
查询主机信息
异步方式
使用 lookupHost() ,实际的查询在一个单独的线程中完成,利用操作系统的方法来执行名称查找。根据主机名查询主机信息
int nID = 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”
根据 IP 查询主机信息
int nID = 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::fromName() 函数: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”
这种情况下,名称查询的执行与调用者处于相同的线程中。这对于非 GUI 应用程序或在一个单独的、非 GUI 线程中做名称查找是比较有用的(在 GUI 线程中调用这个函数可能会导致用户界面冻结)。
中止查询
lookupHost() 查询主机信息时,会返回一个查询 ID,以此 ID 为参数,通过调用 abortHostLookup() 来中止查询:QHostInfo::abortHostLookup(nId);
错误处理
如果查询失败,error() 返回发生错误的类型,errorString() 返回一个能够读懂的查询错误描述。枚举 QHostInfo::HostInfoError:
常量 | 值 | 描述 |
---|---|---|
QHostInfo::NoError | 0 | 查找成功 |
QHostInfo::HostNotFound | 1 | 没有发现主机对应的IP地址 |
QHostInfo::UnknownError | 2 | 未知错误 |
更多参考
Qt之网络编程Qt之QHostAddress
Qt之QNetworkAddressEntry
Qt之QNetworkInterface
相关文章推荐
- QT 同时支持鼠标和触摸屏
- Qt 模块
- Qt之QTextCodec乱谈
- Qt5之正则表达式
- QT中如何实现将textEdit中的内容完全存入txt文本中包括换行
- qt4项目到qt5
- Qt安装配置
- Qt之QHeaderView添加复选框
- Qt之QHeaderView添加复选框
- QT中对BSON的处理
- PyQt 5 教程
- 一种基于Qt的可伸缩的全异步C/S架构server实现(二) 网络传输
- qt连接mysql
- QT qwt 图形控件开发环境部署
- Qt在线讲座之QML脚本书写规范
- Qt5下实现摄像头预览及捕获图像方法一
- 用Qt creator编译QtAV库
- QTCreator 生成可执行程序不能运行的问题
- 我觉得主要靠积累,难度不是问题,主要靠时间积累,以及兴趣带来的学习能力(我觉得至少5年全职Qt开发经验,才能算精通)
- QT for Windows CE 5.0/6.0