簡述
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();
}
- 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”
更多參考
轉自: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。
常用接口
枚舉 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”