QT查询主机信息

一、简介

一般我们在进行网络通信时,有些时候是通过界面上设置输入框 获取到指定的IP地址。但是更多的时候,我们会先查询主机的的MAC地址或者IP地址,而QT就提供了两个类用于实现查询主机地址的功能:QHostInfo 和 QNetworkInterface。

二、QHostInfo类

通过查询官方文档可知,QhostInfo的静态函数localHostName() 可获取本机的主机名,然后根据主机名调用静态函数 fromName(const QString &) 可以获得QhostInfo类的实例,该实例包含了IP地址相关信息。静态函数lookupHost()也可以通过主机名获得QhostInfo类的实例(IP地址相关信息),而且是以异步的方式进行。

常用函数:

静态:

void abortHostLookup(int id)  通过ID中止异步方式主机查询
QHostInfo fromName(const QString &name)   根据主机名获取(同步方式)IP地址(IP地址在QHostInfo类中可得到)
QString localDomainName() 返回本机DNS域名
QString localHostName()   返回本地主机名
//已异步的方式根据主机名查找主机的IP地址,并返回一个表示本次查找的ID,可用于abortHostLookup
int lookupHost(const QString &name, QObject *receiver, const char *member)

普通:

QList<QHostAddress> addresses() const   返回与hostName()主机关联的IP地址列表
HostInfoError error() const				如果主机查找失败,返回失败类型
QString errorString() const				如果主机查找失败,返回错误描述字符串
QString hostName() const				返回主机名
int lookupId() const					返回本次查询的ID
void setAddresses(const QList<QHostAddress> &addresses)
void setError(HostInfoError error)
void setErrorString(const QString &str)
void setHostName(const QString &hostName)
void setLookupId(int id)

通过QHostInfo类同步方式得到主机信息:

//通过QHostInfo类同步方式得到主机信息
void Widget::getLocalInfoForHostInfoSyn()
{
    //得到本地主机名
    QString localName = QHostInfo::localHostName();
    //根据本地主机名获取主机信息(同步方式)
    QHostInfo localInfo = QHostInfo::fromName(localName);

    //显示
    ShowInfo( localInfo);
}
void Widget::ShowInfo(QHostInfo localInfo)
{
    //先清空
    ui->textEdit->clear();

    //显示本地主机名
    ui->textEdit->append("本地主机名:"+localInfo.hostName());

    //返回与主机名相关联的IP地址列表
   QList<QHostAddress> addrList = localInfo.addresses();
   if(addrList.isEmpty()){
       ui->textEdit->append("没有找到与该主机名相关的IP地址!");
       return;
   }

   for(int i=0; i<addrList.count(); i++)
   {
        //判断IP地址协议类型 IPV4 IPV6
       QHostAddress addr = addrList.at(i);
       if(addr.protocol() == QAbstractSocket::IPv4Protocol)//IPV4
       {
           ui->textEdit->append("IPV4地址:" + addr.toString());
       }
       else if(addr.protocol() == QAbstractSocket::IPv6Protocol)
       {
           ui->textEdit->append("IPV6地址:" + addr.toString());
       }
   }
}

通过QHostInfo类异步方式得到主机信息:

//通过QHostInfo类异步方式得到主机信息
void Widget::getLocalInfoForHostInfoAsyn()
{
    //得到本地主机名
    QString localName = QHostInfo::localHostName();
    //根据本地主机名获取主机信息(异步方式)
    lookupId = QHostInfo::lookupHost(localName,this,SLOT(onLookupHostInfoSlot(QHostInfo)));
}
void Widget::onLookupHostInfoSlot(QHostInfo localInfo)
{
    //显示
    ShowInfo( localInfo);
}

int QHostInfo::lookupHost(const QString &name, QObject *receiver, const char *member)

name参数表示主机名的字符串,可以是一个主机名、一个域名、或者是一个IP地址。该函数以异步放查找主机地址,参数receiver 和 member 指定已给响应槽函数的接收者 和函数名。该函数执行之后,程序可能会花一些时间来查找主机地址,但不会阻塞程序的运行。当查找到主机地址后,通过信号通知设定的槽函数,在槽函数里读取查找的结果。函数返回一个本次查找的ID。调用abortHostLookup 可以终止查找。

三、QNetworkInterface类

QNetworkInterface类可以获得应用程序所在主机的所有网络接口,包括其子网掩码和广播地址等。主要用到下面几个函数:

静态:

QList<QHostAddress> allAddresses()  
功能和QHostInfo::addresses()函数功能相似,都是返回一个QHostAddress的列表。只是QNetworkInterface会返回更多地址,包括表示本机的127.0.0.1,而QHostInfo不会返回这么多地址。

QList<QNetworkInterface> allInterfaces()
返回应用程序所在主机上的所有网络接口,如果失败返回空列表

普通:


QString hardwareAddress() const  获取硬件地址(MAC地址)
QString humanReadableName() const 获取设备名

QList<QNetworkAddressEntry> addressEntries() const 返回此接口拥有的IP地址列表及其关联的网络掩码和广播地址。如果不需要网络掩码或广播地址信息,可以调用allAddresses()函数仅获取IP地址。

1、通过allInterfaces()函数查询主机信息,代码如下:

void Widget::getLocalInfoForallInterface()
{
    ui->textEdit->clear();

    QList<QNetworkInterface> allInterfaceList = QNetworkInterface::allInterfaces();

    for(int i=0; i<allInterfaceList.count(); i++)
    {
        QNetworkInterface interface = allInterfaceList.at(i);
        if(!interface.isValid())
            continue;

        //获取设备名
        QString device = interface.humanReadableName();
        //获取硬件地址(MAC地址)
        QString macAddr = interface.hardwareAddress();

        //获取IP地址 子网掩码 广播地址
        QString ip,mask,broad;
        QList<QNetworkAddressEntry> entryList =  interface.addressEntries();
        for(int i=0; i<entryList.count(); i++)
        {
            QNetworkAddressEntry entryAddr = entryList.at(i);
            ip = entryAddr.ip().toString();//IP地址
            mask = entryAddr.netmask().toString();//子网掩码
            broad = entryAddr.broadcast().toString();//广播地址

        }

        ShowInfo(device,macAddr,ip,mask,broad);
    }
}

void Widget::ShowInfo(QString deviceName, QString hardwareName, QString ip, QString netmask, QString broadcast)
{


    ui->textEdit->append("主机名:"+deviceName);
    ui->textEdit->append("硬件地址(MAC):"+hardwareName);
    ui->textEdit->append("IP地址:"+ip);
    ui->textEdit->append("子网掩码:"+netmask);
    ui->textEdit->append("广播地址:"+broadcast);
}

2、通过allAddresses()查询主机信息:

void Widget::getLocalInfoForallAddresses()
{
    ui->textEdit->clear();


    QList<QHostAddress> addrList = QNetworkInterface::allAddresses();
    if(addrList.isEmpty())
        return;

    for(int i=0; i<addrList.count(); i++)
    {
        QHostAddress addr = addrList.at(i);
        if(addr.protocol() == QAbstractSocket::IPv4Protocol)
        {
            ui->textEdit->append("IPV4地址:" + addr.toString());
        }
        else if(addr.protocol() == QAbstractSocket::IPv6Protocol)
        {
            ui->textEdit->append("IPV6地址:" + addr.toString());
        }
    }
}

四、实例

上面的源码可在博主关于获取主机信息实例1 下载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值