在网络编程中经常需要获取本地或远程主机的网络信息,如IP地址、子网掩码、广播地址等,Qt network模块中提供了一些方便的类,如QHostInfo、QNetworkInterface等。
本文将从三种情况介绍Qt网络编程中如何获取主机网络信息。
1.获取本机主机名和IP地址(利用QHostInfo类)
QHostInfo可以调用QHostInfo::localHostName()来获取本机主机名,并根据主机名来获取IP地址等信息,其中,所有的ip地址存放在QHostInfo::addresses()中。另外,根据address.protocol()可以筛选IPv4和IPv6地址。
示例:
QString localHostName=QHostInfo::localHostName();
qDebug()<<"Local host name:"<<localHostName;
QHostInfo info=QHostInfo::fromName(localHostName);//根据上边获得的主机名来获取本机的信息
foreach(QHostAddress address,info.addresses())//info.addresses()---QHostInfo的address函数获取本机ip地址
{
if(address.protocol()==QAbstractSocket::IPv4Protocol)//只取ipv4协议的地址
qDebug()<<"IPV4 addresses:"<<address.toString();
if(address.protocol()==QAbstractSocket::IPv6Protocol)//只取ipv6协议的地址
qDebug()<<"IPV6 addresses:"<<address.toString();
}
2.通过域名查找对应IP地址(利用QHostInfo类)
QHostInfo提供了一个强有力的查找成员lookupHost(),该函数基于信号与槽机制。
因此我们可以先定义一个继承自QObject的专用查找类,然后定义槽函数处理查找结果。
示例:
查找类LookupIp定义如下:
class LookupIp : public QObject
{
Q_OBJECT
public:
explicit LookupIp(QObject *parent=0);
void startLookup(const QString &str);
QString getHostName(void);
void setHostName(const QString &name);
signals:
public slots:
void lookedup(const QHostInfo &host);
private:
QString hostName;
};
成员函数实现:
LookupIp::LookupIp(QObject *parent)
{
qDebug()<<"start lookup IP...";
}
void LookupIp::startLookup(const QString &hostName)
{
QHostInfo::lookupHost(hostName,this,SLOT(lookedup(QHostInfo)));
}
void LookupIp::setHostName(const QString &name)
{
hostName=name;
}
QString LookupIp::getHostName()
{
return hostName;
}
void LookupIp::lookedup(const QHostInfo &host)
{
qDebug()<<"IP address of"<<hostName<<"is:";
foreach(QHostAddress address,host.addresses())//info.addresses()---QHostInfo的address函数获取本机ip地址
{
if(address.protocol()==QAbstractSocket::IPv4Protocol)//只取ipv4协议的地址
qDebug()<<"IPV4 addresses:"<<address.toString();
if(address.protocol()==QAbstractSocket::IPv6Protocol)//只取ipv6协议的地址
qDebug()<<"IPV6 addresses:"<<address.toString();
}
}
3.获取本机完整的网络接口信息(利用QNetworkInterface类)
若想获取比较完整的网络信息,包括网卡等硬件信息,可以利用QNetworkInterface类,该类存储所有网络设备的设备名、Mac地址、IP地址、子网掩码、广播地址等。
示例:
QList<QNetworkInterface> list=QNetworkInterface::allInterfaces();//获取所有网络接口信息
foreach(QNetworkInterface interface,list)
{
//遍历每一个接口信息
qDebug()<<"Device:"<<interface.name();//设备名称
qDebug()<<"HardwareAddress:"<<interface.hardwareAddress();//获取硬件地址
QList<QNetworkAddressEntry>entryList=interface.addressEntries();//获取ip地址和子网掩码和广播地址
foreach(QNetworkAddressEntry entry,entryList)
{//遍历ip条目列表
qDebug()<<"IP address:"<<entry.ip().toString();//获取ip
qDebug()<<"Netmask:"<<entry.netmask().toString();//获取子网掩码
qDebug()<<"Broadcast:"<<entry.broadcast().toString();//获取广播地址
}
}
关于Qt获取网络信息还有一些其他方法,本文给出的方法应该是比较方便快捷的,其他方法大家可以查看Qt帮助文档。