一、简介
一般我们在进行网络通信时,有些时候是通过界面上设置输入框 获取到指定的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 下载。