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