简述

QNetworkInterface类负责提供主机的IP地址和网络接口的列表。

QNetworkInterface表示了当前程序正在运行时与主机绑定的一个网络接口。每个网络接口可能包含0个或多个IP地址,每个IP地址都可选择性地与一个子网掩码和/或一个广播地址相关联。这样的列表可以通过addressEntries()方法获得。当子网掩码或者广播地址不必要时,可以使用allAddresses()便捷函数来仅仅获得IP地址。

QNetworkInterface使用hardwareAddress()方法获取接口的硬件地址。

不是所有的操作系统都支持这些所有的特性。只有IPv4地址可以保证在所有平台上都能被这个类列举出来,尤其是IPv6地址的列举目前只支持Windows XP及相关版本、Linux、MacOS和BSDs。

常用接口

枚举 QNetworkInterface::InterfaceFlag

标识 QNetworkInterface::InterfaceFlags

指定网络接口相关的标识,可能的值:

常量 值 描述
QNetworkInterface::IsUp 0x1 网络接口处于活动状态
QNetworkInterface::IsRunning 0x2 网络接口已分配资源
QNetworkInterface::CanBroadcast 0x4 网络接口工作在广播模式
QNetworkInterface::IsLoopBack 0x8 网络接口是环回接口:也就是说,它是一个虚拟接口,其目的是主机本身
QNetworkInterface::IsPointToPoint 0x10 网络接口是一个点对点接口:也就是说,有一个,单一的其他地址可以直接由它到达。
QNetworkInterface::CanMulticast 0x20 网络接口支持多播

注意:一个网络接口不能既是broadcast-based又是point-to-point。

InterfaceFlags类型是一个QFlags类型定义,它存储一个或InterfaceFlag的组合值。

QList<QHostAddress> allAddresses() [static]

这个便利函数返回主机上面发现的所有IP地址。相当于allInterfaces()返回的所有对象调用addressEntries()来获取QHostAddress对象列表,然后对每一个对象调用QHostAddress::ip()方法。

QList<QNetworkInterface> allInterfaces() [static]

返回的主机上找到的所有的网络接口的列表。在失败情况下,它会返回一个空列表。

QList<QNetworkAddressEntry> addressEntries() const

返回IP地址列表,这个接口具备连同与其相关的网络掩码和广播地址。

如果不需要子网掩码或广播地址的信息,可以调用allAddresses()函数来只获取IP地址。

InterfaceFlags flags() const

返回与此网络接口关联的标志。

QString hardwareAddress() const

返回此接口的底层硬件地址。在以太网接口上,这将是表示MAC地址的字符串,用冒号分隔。

其他接口类型可能有硬件地址的其他类型。不应该依赖于实现这个函数返回一个有效的MAC地址。

QString humanReadableName() const

如果名称可确定,在Windows上,返回网络接口的人类可读的名称,例如:“本地连接”;如果不能,这个函数返回值与name()相同。用户可以在Windows控制面板中修改人类可读的名称,因此它可以在程序的执行过程中变化的名称。

在Unix上,此函数目前返回值总是和name()相同,因为Unix系统不存储人类可读的名称的配置。

bool isValid() const

如果此QNetworkInterface对象包含一个的有效的网络接口,则返回true。

QString QNetworkInterface::name() const

返回网络接口的名称。在Unix系统中,这是一个包含接口的类型和任选的序列号的字符串,例如:“eth0”、“lo”或者“pcn0”;在Windows中,这是一个内部ID,用户不能更改。

获取所有IP地址

通过调用便利的静态函数allAddresses(),可以返回一个QHostAddress地址列表(只能获取IP地址,没有子网掩码和广播地址的信息)。

QList<QHostAddress> list = QNetworkInterface::allAddresses();
foreach (QHostAddress address, list) {
if (!address.isNull())
qDebug() << "Address : " << address.toString();
}

输出如下:

Address : “fe80::550c:ab19:fb48:1c9%15”

Address : “169.254.1.201”

Address : “fe80::d086:8566:6065:8954%11”

Address : “172.18.4.165”

Address : “fe80::f864:a962:7219:f98e%16”

Address : “192.168.17.1”

Address : “fe80::8169:691f:148e:d3cb%17”

Address : “192.168.178.1”

Address : “fe80::5996:27a3:83b5:2ae7%18”

Address : “192.168.56.1”

Address : “::1”

Address : “127.0.0.1”

QHostAddress类提供一个IP地址,更多参考:Qt之QHostAddress

获取网络接口列表

通过调用便利的静态函数allInterfaces(),可以返回一个QNetworkInterface网络接口列表(通过QNetworkAddressEntry,可以获取IP地址、子网掩码和广播地址等信息)。

QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
foreach (QNetworkInterface netInterface, list) {
if (!netInterface.isValid())
continue; qDebug() << "********************"; QNetworkInterface::InterfaceFlags flags = netInterface.flags();
if (flags.testFlag(QNetworkInterface::IsRunning)
&& !flags.testFlag(QNetworkInterface::IsLoopBack)) { // 网络接口处于活动状态
qDebug() << "Device : " << netInterface.name(); // 设备名
qDebug() << "HardwareAddress : " << netInterface.hardwareAddress(); // 硬件地址
qDebug() << "Human Readable Name : " << netInterface.humanReadableName(); // 人类可读的名字
} // QList<QNetworkAddressEntry> entryList = netInterface.addressEntries();
// foreach(QNetworkAddressEntry entry, entryList) { // 遍历每一个IP地址
// qDebug() << "IP Address:" << entry.ip().toString(); // IP地址
// qDebug() << "Netmask:" << entry.netmask().toString(); // 子网掩码
// qDebug() << "Broadcast:" << entry.broadcast().toString(); // 广播地址
//}
}

通过flags()函数,可以获取到当前网络接口的标识,利用testFlag()进行过滤,就可以获取我们想要的内容(设备名、硬件地址、名字)。

注意:为了简单,我注释掉了IP地址的信息,需要的可以自行测试。

QNetworkAddressEntry类存储了一个IP地址,子网掩码和广播地址。更多参考:Qt之QNetworkAddressEntry

输出如下:


Device : “{BE9972CD-860E-4E15-8CE2-3F25EF0A7A24}”

HardwareAddress : “94:DE:80:21:92:17”

Human Readable Name : “本地连接”


Device : “{29F85058-E757-4F60-BF7B-47F6227C8CBC}”

HardwareAddress : “00:50:56:C0:00:01”

Human Readable Name : “VMware Network Adapter VMnet1”


Device : “{A297491C-D43C-4F85-A674-88368F8D4FC1}”

HardwareAddress : “00:50:56:C0:00:08”

Human Readable Name : “VMware Network Adapter VMnet8”


Device : “{1AE5F6FC-478A-4EAB-B4D2-86201A6B2090}”

HardwareAddress : “0A:00:27:00:00:12”

Human Readable Name : “VirtualBox Host-Only Network”

更多参考

Qt之QNetworkInterface的更多相关文章

  1. Qt之QNetworkInterface(查询网络接口),QHostInfo(查询主机IP)

    http://blog.csdn.net/u011012932/article/details/50775052 http://blog.csdn.net/u011012932/article/det ...

  2. Qt之QHostInfo

    简述 QHostInfo 类为主机名查找提供了静态函数. QHostInfo 利用操作系统提供的查询机制来查询与特定主机名相关联的主机的 IP 地址,或者与一个IP地址相关联的主机名.这个类提供了两个 ...

  3. 《Qt 实战一二三》

    简介 "我们来自Qt分享&&交流,我们来自Qt Quick分享&&交流",不管你是笑了,还是笑了,反正我们是认真的.我们就是要找寻一种Hold不住的 ...

  4. QT 网络编程一

    QT如果要进行网络编程首先需要在.pro中添加如下代码:QT += network 在头文件中包含相关头文件 #include <QHostInfo> #include <QNetw ...

  5. Qt之获取本机网络信息(MAC, IP等等,很全)

    经常使用命令行来查看一些计算机的配置信息. 1.首先按住键盘上的“开始键+R键”,然后在弹出的对话框中输入“CMD”,回车 另外,还可以依次点击 开始>所有程序>附件>命令提示符 2 ...

  6. 【Qt】QT5 获取IP地址

    QT获取本机IP地址 #include <QtNetwork/QHostAddress> #include <QtNetwork/QNetworkInterface> #inc ...

  7. 基于Qt的P2P局域网聊天及文件传送软件设计

    基于Qt的P2P局域网聊天及文件传送软件设计 zouxy09@qq.com http://blog.csdn.net/zouxy09         这是我的<通信网络>的课程设计作业,之 ...

  8. 将vim作为QT开发的IDE

    转载请注明链接与作者huihui1988 用了一段时间的vim,喜欢上了这种简洁高效的编辑器.恰逢正在学习QT中,于是将vim变成了开发QT的工具.以下是具体配置. 一.语法高亮支持: 1.打开VIM ...

  9. LINUX下QT与C语言通过网卡名获取网卡IP与MAC

    1.QT下 QString RuntimeConfig::ipAddress(QString network) { QList<QNetworkAddressEntry> list; QS ...

随机推荐

  1. 在线API文档

    http://www.ostools.net/apidocs A Ace akka2.0.2 Android Ant Apache CXF Apache HTTP服务器 ASM字节码操作 AutoCo ...

  2. iOS多线程的初步研究(十)-- dispatch同步

    GCD提供两种方式支持dispatch队列同步,即dispatch组和信号量. 一.dispatch组(dispatch group) 1. 创建dispatch组 dispatch_group_t ...

  3. 安装mysql之后,存入中文出现乱码 02

    现在出现这个问题,将编码字符串改成utf8 之后 数据表 还是不能存储中文. 看如下两张图,应该会有启发: 这下应该明白了吧.

  4. Python 融于ASP框架

    一.ASP的平反 想到ASP 很多人会说 “asp语言很蛋疼,不能面向对象,功能单一,很多东西实现不了” 等等诸如此类. 以上说法都是错误的,其一ASp不是一种语言是 微软用来代替CGI的一种web框 ...

  5. MyEclipse — Maven+Spring+Struts+Hibernate 整合 [学习笔记-5]

    测试项目 目录结构

  6. OnClientClick="return confirm('确定要删除吗?')"

    OnClientClick="return confirm('确定要删除吗?')"   -----------------------前台代码 OnClientClick用于执行客 ...

  7. 10 signs you’re dating the wrong person

    10 signs you’re dating the wrong person10个迹象表明TA不是你的真心人       Do you have any exes who were so awful ...

  8. 做一款仿映客的直播App

    投稿文章,作者:JIAAIR(GitHub) 一.直播现状简介 1.技术实现层面 技术相对都比较成熟,设备也都支持硬编码.iOS还提供现成的Video ToolBox框架,可以对摄像头和流媒体数据结构 ...

  9. 转载网页博客:ie7bug:div容器下的img与div存在间隙

    1.代码及在浏览器上的显示 ie7: ie8+: Firefox: Chrome: 可以看出ie7上在div容器下添加img,div与img中有间隙,而在ie8+和其他浏览器上均显示正常 网页源代码如 ...

  10. wordpress学习二:源码目录结构和启动流程

    wordpress安装后的文件目录如下: 其中的主要目录和文件用途介绍如下: wp-admin:用于进行博客后台设置的功能目录 wp-content: wordpress的 主题,插件和本地化的存储目 ...