Qt之QNetworkInterface


簡述

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”

更多參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM