简述

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. centos 安装软件

    1)一种是软件的源代码,您需要自己动手编译它.这种软件安装包通常是用gzip压缩过的tar包(后缀为.tar.gz).2)另一种是软件的可执行程序,你只要安装它就可以了.这种软件安装包通常被是一个RP ...

  2. Sqli-labs less 57

    Less-57 从代码中看到对id进行了 " " 的处理,所以此处我们构造的payload要进行 "" 的处理,示例payload: http://127.0. ...

  3. 本地安装xssing

    本地安装xssing 环境为apache+mysql+php,linux下和Windows均进行了尝试. 步骤: (1)Mysql中创建xing数据库,将xssing.sql中的语句复制并在xing数 ...

  4. iOS正则匹配手机号

    #pragma 正则匹配手机号 + (BOOL)validateMobile:(NSString *)mobileNum {     /**      * 手机号码      * 移动:134[0-8 ...

  5. SharePoint文档库文件大小限制(win2008+II7)问题

    我们在用SharePoint存储文档时,用户要上传五十多MB到站点上,结果受到上传大小限制.在管理中心里做了修改,增加了上载大小限制.可是用户在上传的时候,提示复制一个或多个文件失败(win2003) ...

  6. Struts2 Convention插件的使用(4)使用@Action注解返回json数据

    package com.hyy.action; import java.util.HashMap; import java.util.Map; import org.apache.struts2.co ...

  7. 使用RockMongo管理MongoDB

    http://blog.csdn.net/mydeman/article/details/7082730

  8. Fatal error: cannot allocate memory for the buffer pool

    mysql有时候会被系统kill掉,原因是内存不够了,一般都是Ubuntu出现的,因为Ubuntu吃内存,你们又给的不多.. 咋解决呢? 重启服务器是可以的,起码暂时可以了, 可以考虑加内存,或者增加 ...

  9. Adb connection Error:远程主机强迫关闭了一个现有的连接 解决方法

    用真机调试程序的时候,eclipse 的 Console 总是出现如下的错误"Adb connection Error:远程主机强迫关闭了一个现有的连接". 问题出现的原因:这是 ...

  10. [iOS]SourceTree+oschina实现代码远程托管

    在iOS开发, 涉及到多人协同开发的时候, 这个时候, 我们就得利用版本控制系统(例如GIT), 来合并和管理代码了, 今天我们来讲一下, 利用 SourceTree+oschina进行版本控制 先来 ...