qt获取网卡信息 QNetworkInterface

QNetworkInterface 是一个管理网络连接的类,利用他可以枚举本机的网络连接并获取其属性。比较常用的函数有:

  • QList QNetworkInterface::addressEntries() 获取地址列表,应用如下:
?

//原型 QList QNetworkInterface::addressEntries () const
//比如获取本地所有 ip 和 netmask
//allInterfaces() 是一个静态函数,用于获取本机所以连接。
QList networkInterface = QNetworkInterface::allInterfaces();
for  (QList::const_iterator i = networkInterface.const_Begin(); i != networkInterface.const_End(); ++i) {
   //获取连接地址列表
   QList addressEntriesList = (*i).addressEntries();
   for  (QList::const_iterator j = addressEntriesList.constBegin(); j != addressEntriesList.constEnd(); ++j) {
     //输出 ip
     qDebug() << (*i).ip().toString();
     //输出 netmask
     qDebug() << (*i).ip().toString();
   }
}
  • QString QNetworkInterface::hardwareAddress() 获取网卡 mac 地址。例如,在上例中:

1
(*i).hardwareAddress();
  • QString QNetworkInterface::name() 获取网卡名称。这个名称是系统分配的,是一个字符串,在 windows 平台,可以将此字符串作为参数传递给 api,用以获取或者设置其他 Qt 不能获取或设置的属性,比如网关、DNS、网卡类型、wins 服务器的获取与设置,可以参考 windows api 中的 getAdapterInfo 和 getPerAdaterInfo 来实现这些功能。
  • QNetworkInterface QNetworkInterface::interfaceFormName(),通过名称来获取一个QNetworkInterface的对象或指针,此处名称也是上述所指名称。
  • QString QNetworkInterface::humanReadableName(),获取网络连接名称,此处名称一般指“本地连接”、“eth0”及“lo”等。
  • int QNetworkInterface::index(),网卡索引,这是系统在启动时为网卡分配的索引,是一个整型值,当然也可以成为 Qt 与系统 api 之间的接口,就像上的是 name() 一样。
  • QNetworkInterface QNetworkInterface::interfaceFromIndex ( int index ),通过索引值来获取一个QNetworkInterface的对象或指针,此处索引值即为上述所指整型值。
  • QList QNetworkInterface::allAddresses (),获取地址列表,此处只返回IP地址列表,所以如果只想获取IP地址的话,可以用此函数,例如:
?
//allInterfaces() 是一个静态函数,用于获取本机所以连接。
QList networkInterface = QNetworkInterface::allInterfaces();
for  (QList::const_iterator i = networkInterface.const_Begin(); i != networkInterface.const_End(); ++i) {
   //获取ip地址列表
   QList addressesList = (*i).allAddresses();
   for  (QList::const_iterator j = addressesList.constBegin(); j != addressesList.constEnd(); ++j) {
     //输出 ip
     qDebug() << (*i).toString();
   }
}



qt获取网络ip地址的类QHhostInfo,QNetworkInterface,QHostAdress

最近在学习qt网络编程,基于tcp和udp协议。

看了一些别人的程序和qt4自带的例子,困扰我最大的问题就是获取ip的类,总结起来还挺多的。

主要介绍常用的QtNetwork Module中的QHostInfo,QHostAddress,QNetworkInterface和QNetAddressEntry等类。

1。QHostInfo类获取主机名和ip地址

(1)获取主机名: QHostInfo::localHostName()

QString localHostName=QHostInfo::localHostName();

(2)获取ip地址: QHostInfo info=QHostInfo::fromName(localHostName);//根据上边获得的主机名来获取本机的信息

info.addresses();//QHostInfo的address函数获取本机ip地址

如果存在多条ip地址ipv4和ipv6:

foreach(QHostAddress address,info.addresses())

{

if(address.protocol()==QAbstractSocket::IPv4P)//只取ipv4协议的地址

qDebug()<

}

如果是ipv6地址,可以使用QAbstractSocket::ipv6Protocol来实现。

QHostAddress类是管理ip地址的类,所有的ip都归这个类管理。

(3)以主机名获取ip

QHostInfo类可以获取任意主机名的ip,比如获取网站的ip地址,可以用lookupHost()函数来获取,他是基于信号和槽的,一旦发现ip地址就会触发槽函数。

首先定义一个槽函数:

void lookedup(const QHostInfo &host)

{

qDebug()<

}

QHostInfo::lookupHost("www.baidu.com" ,

this,SLOT(lookedUp(QHostInfo)));

通过查询百度网址的ip地址,如果查找到,就会执行lookedUp()函数。

 

(4)通过ip地址获取主机名

调用lookupHost()函数,通过输入ip地址反向查找主机名。将上面的函数换掉。

 

2。QNetworkInterface类获取程序运行本机的ip地址和网络接口信息

QNetworkInterface类提供了程序所运行的主机ip地址和网络接口信息的列表.  在一个网络接口信息中,包含一个或多个ip地址,每一个ip地址又包含和它相关的子网掩码和广播地址.他们三者别封装在一个对象中QNetworkAddressEntry,网络接口信息也包含了硬件地址信息.

QListlist=QNetworkInterface;:allInterfaces();//获取所有网络接口信息

foreach(QNetworkInterface interface,list)

{

//便利每一个接口信息

qDebug<<"Device:"<

qDebug<<"HardwareAddress:"<

QListentryList=interface.addressEntries();//获取ip地址和子网掩码和广播地址

foreach(QNetworkAddressEntry entry,entryList)

{//便利ip条目列表

qDebug<<"IP address:"<

qDebug<<"Netmask:"<

qDebug<<"Broadcast:"<

}

}

 

如果只想获取ip地址可以调用QNetworkInterface类的allAddresses()来获取ip地址,如:

QString address=QNetworkInterface::allAddresses().first().toString();

获取所有ip地址:

QListlist=QNetworkInteface::allAddresses();

{

foreach(QHostAddress address,list)

{

if(address.protocol()==QAbstractSocket::ipv4protocol)

qDebug<

}

}


你可能感兴趣的:(QT)