Qt之QHostInfo
简述
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之QHostInfo的更多相关文章
- Qt之QNetworkInterface
简述 QNetworkInterface类负责提供主机的IP地址和网络接口的列表. QNetworkInterface表示了当前程序正在运行时与主机绑定的一个网络接口.每个网络接口可能包含0个或多个I ...
- 《Qt 实战一二三》
简介 "我们来自Qt分享&&交流,我们来自Qt Quick分享&&交流",不管你是笑了,还是笑了,反正我们是认真的.我们就是要找寻一种Hold不住的 ...
- Qt之QNetworkInterface(查询网络接口),QHostInfo(查询主机IP)
http://blog.csdn.net/u011012932/article/details/50775052 http://blog.csdn.net/u011012932/article/det ...
- Qt 多线程和网络编程学习
一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run( ...
- QT 网络编程一
QT如果要进行网络编程首先需要在.pro中添加如下代码:QT += network 在头文件中包含相关头文件 #include <QHostInfo> #include <QNetw ...
- qt 获取当前主机的信息
随着科技的发展,嵌入式技术在生活中越来越扮演者重要的角色,小到智能手环.手机,大到智能家居.汽车,都和嵌入式技术息息相关.在嵌入式系统中,拥有良好的用户界面会使产品更具市场优势.最近正好有机会用qt做 ...
- 《Linux与Qt程序设计》知识框架
本文主要是通过一本书来大致了解Qt开发的框架,不对具体内容做详细分析. 1.首先弄清楚概念:定义->以自己的话理解是什么-> 实现的是什么功能->用在哪些地方 2.前面认识到的知识点 ...
- Qt之获取本机网络信息(MAC, IP等等,很全)
经常使用命令行来查看一些计算机的配置信息. 1.首先按住键盘上的“开始键+R键”,然后在弹出的对话框中输入“CMD”,回车 另外,还可以依次点击 开始>所有程序>附件>命令提示符 2 ...
- 【Qt】QT5 获取IP地址
QT获取本机IP地址 #include <QtNetwork/QHostAddress> #include <QtNetwork/QNetworkInterface> #inc ...
随机推荐
- 一道题DP
Problem Description 小明明又被大威鱼抓住了,大威鱼把小明明关在地牢里,地牢由n * n 个房间组成,小明被困在地牢的最左上角的房间中,出口在最右下角,他想逃出这个诡异的地牢,但是他 ...
- HTML页面加载和解析流程详细介绍
浏览器加载和渲染html的顺序 1. IE下载的顺序是从上到下,渲染的顺序也是从上到下,下载和渲染是同时进行的. 2. 在渲染到页面的某一部分时,其上面的所有部分都已经下载完成(并不是说所有相关联的元 ...
- C#中“貌似”跳出while(true)死循环
当程序第一次执行到Read()函数时,程序会被阻塞,然后输入字符,Enter之后程序被激活,windows平台会自动在输入字符之后加入回车符和换行符,此时输入流中就有三个字符,然而read每次只读取一 ...
- Extjs利用vtype验证表单
Ext.create('Ext.form.Panel', { title: '表单验证', renderTo: Ext.getBody(), frame ...
- 动态修改 NodeJS 程序中的变量值
如果一个 NodeJS 进程正在运行,有办法修改程序中的变量值么?答案是:通过 V8 的 Debugger 接口可以!本文将详细介绍实现步骤. 启动一个 HTTP Server 用简单的 Hello ...
- POJ 2039
#include<iostream> #include<stdio.h> #include<string> #define MAXN 20 using namesp ...
- DF学Mysql(三)——Mysql数据类型
Mysql数据类型分为:整数类型.浮点数类型.定点数类型日期与时间类型字符串类型二进制类型 整数类型 字节数 无符号数取值范围 有符号数取值范围TINYINT 1 0-255 -128-127SMAL ...
- HDU 1260 Tickets(简单dp)
Tickets Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- Peer certificate cannot be authenticated with known CA certificates.
I was trying to post to a webservice and was getting the 60 error code: Peer certificate cannot be a ...
- 使用动态SQL语句实现简单的行列转置(动态产生列)
原始数据如下图所示:(商品的销售明细)date=业务日期:Item=商品名称:saleqty=销售数量: -- 建立测试数据(表)create table test (Date varchar(10) ...