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;
}