获取网络接口信息的四种方式

#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();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值