天天看點

Qt網絡程式設計1-擷取主機資訊

Qt網絡程式設計1-擷取主機資訊

1 概述:

在網絡程式設計中,通常需要擷取主機名,IP位址,MAC位址.其中相關的類有QHostInfo,QNetworkInterface, QNetworAddressEntry.

2 相關的類和方法:

2.1 QHostInfo

簡述:這個類提供了查找ip位址和主機名的相關方法

幾個常用的靜态成員函數

1)localHostName()

//擷取這台機器的主機名稱
QString QHostInfo::localHostName()
           

2)fromName()

//根據主機名稱查詢Ip位址 在查詢期間,該函數阻塞,直到準備好查詢結果.将查詢結果放在一個QHost對象中
QHostInfo QHostInfo::fromName(const QString &name)
           

3)addresses()

//傳回主機的Ip位址,傳回值可能為空
QList<QHostAddress> QHostInfo::addresses() const
           

4)hostName()

//傳回IP位址被查詢的主機名稱
QString QHostInfo::hostName() const
           

2.2 QNetworkInterface

提供了IP位址和網絡接口的清單.每個網絡接口都有0個或多個IP,這個IP位址随意的關聯一個子網路遮罩和廣播位址

2.2.1 相關的成員函數

1)allInterfaces()

//傳回這台主機上的所有的網絡接口
[static]QList<QNetworkInterface> QNetworkInterface::allInterfaces()
           

2)allAddresses()

//傳回這台主機上的所有ip位址
[static] QList<QHostAddress> QNetworkInterface::allAddresses()
//傳回ip位址的清單
QList<QNetworkAddressEntry> QNetworkInterface::addressEntries() const
           

3)broadcast()

//傳回廣播位址 IPv4位址 和子網路遮罩
QHostAddress QNetworkAddressEntry::broadcast() const
           

4)ip()

//傳回IPV4或IPv6位址
QHostAddress QNetworkAddressEntry::ip() const
           

5)netmask()

//傳回和IP位址關聯的子網路遮罩
QHostAddress QNetworkAddressEntry::netmask() const
           

說明:要使用這些類,需要在.pro檔案中加入

QT+= network
           

3 相關Demo

#include <QCoreApplication>
#include <QHostInfo>
#include <QList>
#include <QNetworkInterface>
#include <iostream>
using namespace  std;
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QString localHostName = QHostInfo::localHostName();
    QHostInfo info = QHostInfo::fromName(localHostName);
    QList<QHostAddress> addressList;
    addressList = info.addresses();
    cout << info.hostName().toStdString() << endl;
    if(!addressList.isEmpty()){
        for(auto it = addressList.begin();it!=addressList.end();it++){
                 string str = (*it).toString().toStdString();
                 cout << str << endl;
        }

    }
    QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
    for(auto it = list.begin();it!=list.end();it++){
        string deviceName = it->name().toStdString();
        cout << "裝置名稱" << deviceName << endl;
        string hardWareAddress =  it->hardwareAddress().toStdString();
        cout << "硬體位址" << hardWareAddress << endl;
        QNetworkInterface interface = *it;
        QList<QNetworkAddressEntry> entrylist = interface. addressEntries();
         for(auto it1 = entrylist.begin();it1 != entrylist.end();it1++){
             cout << "Ip位址:" << endl << it1->ip().toString().toStdString() << endl;
             cout << "子網路遮罩:" << endl << it1->netmask().toString().toStdString() << endl;
             cout << "廣播位址" << endl <<  it1->broadcast().toString().toStdString() << endl;
         }
    }

    return 0;
}
           

繼續閱讀