#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class QHostInfo;
class QDnsLookup;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void lookedUp(const QHostInfo &host);
void handleServers();
private:
QDnsLookup* dns;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include <QtNetwork>
#include <QDnsLookup>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
//![1]
//静态函数获取本地主机名称(设备名称)
QString localHostName = QHostInfo::localHostName();
//根据主机名获取QHostInfo对象
QHostInfo info = QHostInfo::fromName(localHostName);
//addresses返回的是一个QHostAddress对象的列表。QHostAddress类代表一个Ip地址
qDebug() << "localHostName:" << localHostName << endl << "IP Address:" << info.addresses();
foreach(QHostAddress address, info.addresses()){
if(address.protocol() == QAbstractSocket::IPv4Protocol){
qDebug() << address.toString();
}
}
//![2]
//使用lookupHost获取IP地址,需要指定一个主机名、一个QObject指针和一个槽
//对百度网站的IP地址进行查找
QHostInfo::lookupHost("www.baidu.com", this, SLOT(lookedUp(QHostInfo)));
//通过lookupHost函数的返回值终止查找
QHostInfo::abortHostLookup(1);
//![3]
//QNetworkInterface类来获取主机的IP地址列表和网络接口信息
//获取所有网络接口的列表
QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
foreach(QNetworkInterface interface, list){
qDebug() << "Name:" << interface.name(); //接口名称,包含接口类型和可选的序号
qDebug() << "HardwareAddress:" << interface.hardwareAddress();//底层硬件地址
//QNetworkAddressEntry保存了IP地址条目列表,每个条目包含一个IP地址、子网掩码和广播地址
QList<QNetworkAddressEntry> entry_list = interface.addressEntries();
foreach (QNetworkAddressEntry entry, entry_list) {
qDebug() << "IP Address:" << entry.ip().toString();
qDebug() << "Netmask:" << entry.netmask().toString();
qDebug() << "Broadcast:" << entry.broadcast().toString();
}
}
//![4]
//DNS查询,异步执行
dns = new QDnsLookup(this);
connect(dns, SIGNAL(finished()), this, SLOT(handleServers()));
dns->setType(QDnsLookup::A);//设置查询类型
dns->setName("www.baidu.com");//主机名
dns->lookup();
}
MainWindow::~MainWindow()
{
}
void MainWindow::lookedUp(const QHostInfo &host)
{
if(host.error() != QHostInfo::NoError){
qDebug() << "Lookup failed:" << host.errorString();
return;
}
foreach (const QHostAddress &address, host.addresses()) {
qDebug() << "Found address:" << address.toString();
}
}
void MainWindow::handleServers()
{
if(dns->error() != QDnsLookup::NoError){
qWarning("DNS lookup failed");
dns->deleteLater();
return;
}
//根据不同的查询类型,分别由 canonicalameRecords(),hostAddressRecords(),mailExchangeRecords(),
//nameServerRecords(),pointerRecords (),serviceRecords()和 textRecords()等函数返回不同类型记录的列表。
//每种类型记录都对应一个类,可以通过特定类提供的函数来获取记录信息
foreach (const QDnsHostAddressRecord &record, dns->hostAddressRecords()) {
qDebug() << record.value();
}
dns->deleteLater();
}
