Qt之QNetworkInterface

简介: 简述 QNetworkInterface类负责提供主机的IP地址和网络接口的列表。 QNetworkInterface表示了当前程序正在运行时与主机绑定的一个网络接口。每个网络接口可能包含0个或多个IP地址,每个IP地址都可选择性地与一个子网掩码和/或一个广播地址相关联。这样的列表可以通过addressEntries()方法获得。当子网掩码或者广播地址不必要时,可以使用a
+关注继续查看

简述

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”

更多参考

目录
相关文章
|
1月前
|
开发框架 Linux API
2023-6-1-Qt是什么
2023-6-1-Qt是什么
39 0
|
8月前
QT
QT
108 0
|
Linux 调度 数据安全/隐私保护
Qt之QFtp
简述 QFtp 类提供了一个 FTP 协议的客户端实现。 该类提供了一个到 FTP 的直接接口,允许对请求有更多的控制。但是,对于新的应用程序,建议使用 QNetworkAccessManager 和 QNetworkReply,因为这些类拥有一个更简单、还更强大的 API。 简述 QFtp 工作流程 基本使用 连接并登录 FTP 服务器 切换工作目录 列出目
6259 0
|
存储 安全 Windows
Qt之QEvent
简述 QEvent 类是所有事件类的基类,事件对象包含事件参数。 Qt 的主事件循环(QCoreApplication::exec())从事件队列中获取本地窗口系统事件,将它们转化为 QEvents,然后将转换后的事件发送给 QObjects。 一般来说,事件来自底层窗口系统(spontaneous() 返回 true),但也可以使用 QCoreApplication:
1653 0
|
数据安全/隐私保护
Qt之QUrl
简述 QUrl 类提供了一个方便的接口使用 URLs。 它可以解析和构造编码和未编码形式的 URLs。QUrl 也支持国际化域名(IDNs)。 简述 详细描述 错误检查 字符转换 URL格式 scheme Authority user info path query fragment 深入使用 相对路径 用户输入 文件名 主机端口 本地文件 百分比编码
6052 0
|
存储
Qt之QUrlQuery
简述 QUrlQuery 类提供了一种方法来操纵 URL 查询中的 key-value 对。 简述 详细描述 编码 处理空格和加号 全解码 非标准分隔符 使用 QUrlQuery 分隔符 查询 删除 是否为空 详细描述 QUrlQuery 用来解析 URL 中的查询字符串,像下面这样: 上述的查询字符串在 URL 中 被用来传输
2541 0
Qt之QScrollArea
简述 QScrollArea提供了一个滚动视图到另一个部件。 滚动区域用于显示一个画面中的子部件的内容。如果部件超过画面的大小,视图可以提供滚动条,这样就都可以看到部件的整个区域。 简述 基本使用 对齐方式 调整部件大小 手动调整 自动调整 获取与移除部件 获取 移除 基本使用 子部件必须使用setWidget()指定,例如: QLab
2881 0
Qt之QDateEdit和QTimeEdit
简述 QDateEdit类提供了一个部件,用于编辑日期。QTimeEdit类提供了一个部件,用于编辑时间。 简述 详细描述 基本使用 各司其职 莫强求 更多参考 详细描述 QDateEdit和QTimeEdit均继承自QDateTimeEdit,许多特性和功能都有QDateTimeEdit提供。这些都是相关属性: QDateEdit da
2656 0
Qt之QDateTimeEdit
简述 QDateTime类提供了一个部件,用于编辑日期和时间。 QDateTimeEdit允许用户编辑日期,通过使用键盘或箭头键来增加和减少日期和时间值。箭头键可以在QDateTimeEdit内进行部分移动,日期和时间的格式按照setDisplayFormat()设置的显示。 简述 基本使用 效果 源码 日期时间格式 效果 源码 日期时间范围 效果
2392 0