Qt之QNetworkInterface
簡述
QNetworkInterface類負責提供主機的IP地址和網絡接口的列表。
QNetworkInterface表示了當前程序正在運行時與主機綁定的一個網絡接口。每個網絡接口可能包含0個或多個IP地址,每個IP地址都可選擇性地與一個子網掩碼和/或一個廣播地址相關聯。這樣的列表可以通過addressEntries()方法獲得。當子網掩碼或者廣播地址不必要時,可以使用allAddresses()便捷函數來僅僅獲得IP地址。
QNetworkInterface使用hardwareAddress()方法獲取接口的硬件地址。
不是所有的操作系統都支持這些所有的特性。只有IPv4地址可以保證在所有平臺上都能被這個類列舉出來,尤其是IPv6地址的列舉目前只支持Windows XP及相關版本、Linux、MacOS和BSDs。
?
- 簡述
- 常用接口
- 獲取所有IP地址
- 獲取網絡接口列表
- 更多參考
?
常用接口
枚舉 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(); }- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
輸出如下:
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(); // 廣播地址//} }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
通過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之網絡編程
- Qt之QHostInfo
- Qt之QHostAddress
- Qt之QNetworkAddressEntry
轉自:http://blog.csdn.net/liang19890820/article/details/50775052
簡述
QNetworkInterface類負責提供主機的IP地址和網絡接口的列表。
QNetworkInterface表示了當前程序正在運行時與主機綁定的一個網絡接口。每個網絡接口可能包含0個或多個IP地址,每個IP地址都可選擇性地與一個子網掩碼和/或一個廣播地址相關聯。這樣的列表可以通過addressEntries()方法獲得。當子網掩碼或者廣播地址不必要時,可以使用allAddresses()便捷函數來僅僅獲得IP地址。
QNetworkInterface使用hardwareAddress()方法獲取接口的硬件地址。
不是所有的操作系統都支持這些所有的特性。只有IPv4地址可以保證在所有平臺上都能被這個類列舉出來,尤其是IPv6地址的列舉目前只支持Windows XP及相關版本、Linux、MacOS和BSDs。
?
- 簡述
- 常用接口
- 獲取所有IP地址
- 獲取網絡接口列表
- 更多參考
?
常用接口
枚舉 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(); }- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
輸出如下:
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(); // 廣播地址//} }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
通過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之網絡編程
- Qt之QHostInfo
- Qt之QHostAddress
- Qt之QNetworkAddressEntry
總結
以上是生活随笔為你收集整理的Qt之QNetworkInterface的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux系统(五)负载均衡LVS集群之
- 下一篇: day3-文件操作之基本操作