简介:
Qt 网络模块提供了用于编写 TCP/IP 客户端和服务器端程序的各种类,如用于 TCP 通信的QTcpSocket 和 QTcpServer,用于 UDP 通信的 QUdpSocket,还有用于实现 HTTP、FTP 等普通网络协议的高级类如 QNetworkRequest,QNetworkReply 和QNetworkAccessManager。Qt 网络模块还提供用于网络代理、网络承载管理的类,提供基于安全套接字层(Secure Sockets Layer,SSL)协议的安全网络通信的类。
要在程序中使用 Qt 网络模块,需要在项目配置文件中增加一条配置语句:
Qt += network
QHostInfo 和 QNetworkInterface 类
查询一个主机的MAC地址或IP 地址是网络应用程序中经常用到的功能,Qt提供了QHostInfo和QNetworkInterface 类可以用于此类信息的查询。
QHostInfo 的静态函数 localHostName()可获取本机的主机名,静态函数 fromName()可以通过主机名获取IP 地址,静态函数 lookupHost()可以通过一个主机名,以异步方式查找这个主机的IP地址。下表是QHostInfo 类主要的功能函数(省略了函数中的const 关键字)。
以下是QHostInfo
类的一些常用函数的解释:
函数 | 描述 |
QHostInfo() | 默认构造函数,创建一个空的QHostInfo 对象。 |
QHostInfo(const QHostInfo &other) | 拷贝构造函数,根据给定的other 对象创建一个新的对象。 |
QHostInfo &operator=(const QHostInfo &other) | 赋值运算符,将other 对象的值赋给当前对象。 |
QHostInfo &swap(QHostInfo &other) | 交换两个QHostInfo 对象的值。 |
bool isNull() const | 判断QHostInfo 对象是否为空,即未进行任何查询。 |
bool isComplete() const | 判断查询是否完成,返回true 表示查询已完成,false 表示正在进行中。 |
QList<QHostAddress> addresses() const | 返回与主机相关联的IP地址列表。 |
QString hostName() const | 返回主机的名称。 |
QStringList aliases() const | 返回主机的别名列表。 |
QHostInfo::Error error() const | 返回查询时发生的错误。 |
QString errorString() const | 返回与错误代码对应的人类可读的错误字符串。 |
static QHostInfo fromName(const QString &name) | 根据主机名创建QHostInfo 对象。 |
static QHostInfo fromAddress(const QHostAddress &address) | 根据IP地址创建QHostInfo 对象。 |
static QHostInfo localHostName() | 返回本地主机的QHostInfo 对象。 |
void clear() | 清空QHostInfo 对象,重置为初始状态。 |
void swap(QHostInfo &first, QHostInfo &second) | 交换两个QHostInfo 对象的值。 |
这些函数提供了对主机信息的查询、获取和处理的操作。需要注意,很多函数都是通过异步查询的方式获取主机信息的,因此在使用时需要通过信号-槽机制来获取查询结果。
在使用这个模块时,要确保导入QT+=network模块,接着来看该如何实现查询本机IP地址,通过调用QHostInfo::localHostName可以直接获取到本机的主机名,调用QHostInfo::fromName(hostName)可将该主机名转换为对应的HostInfo结构,当具备了这个结构体以后,就可以通过循环遍历addList.count()内的所有记录,并aHost.toString()输出所有的IP地址表,举个例子:
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::GetHostNameAndIpAdress()
{
//1,获取主机名称
QString StrLocalHosetName=QHostInfo::localHostName();
ui->lineEdit_hostname->setText(StrLocalHosetName);
//根据主机名称获取对应的IP地址
QString StrLocalIpAdress="";
// 查询主机IP地址信息
QHostInfo hostinfo=QHostInfo::fromName(StrLocalHosetName);
QList<QHostAddress> ipaddresslist=hostinfo.addresses();
if(!ipaddresslist.isEmpty()){
for(int i=0;i<ipaddresslist.size();i++){
// 每一项是一个QHostAddress
QHostAddress addresshost=ipaddresslist.at(i);
// 判断是否为IPV4
if(QAbstractSocket::IPv4Protocol==addresshost.protocol()){
StrLocalIpAdress=addresshost.toString();
break;
}
}
}
ui->lineEdit_hostnameip->setText(StrLocalIpAdress);
}
void Dialog::on_pushButton_gethost_clicked()
{
GetHostNameAndIpAdress();
}
运行结果:点击获取主机信息个IP地址之后
QNetworkInterface 可以获得运行应用程序的主机的所有 IP 地址和网络接口列表。静态函数allInterfaces()返回主机上所有的网络接口的列表,一个网络接口可能包括多个的IP 地址,每个IP地址与掩码或广播地址关联。如果无需知道子网掩码和广播的IP 地址,使用静态函数 allAddresses()可以获得主机上的所有IP 地址列表。下表是QNetworkInterface 类的主要功能函数。
QList<QNetworkInterface> allInterfaces(QNetworkInterface::InterfaceType type) | 返回指定类型的所有网络接口列表。 |
static QList<QNetworkInterface> allInterfaces() | 返回系统中所有可用的网络接口列表。 |
static QNetworkInterface interfaceFromName(const QString &name) | 根据给定名称返回对应的网络接口。 |
static QList<QNetworkInterface> allAddresses() | 返回系统中所有网络接口的IP地址列表。 |
QString name() const | 返回网络接口的名称。 |
QNetworkInterface::InterfaceType type() const | 返回网络接口的类型。 |
bool isValid() const | 判断网络接口是否有效。 |
QNetworkAddressEntry addressEntryAt(int index) const | 返回索引位置的网络接口地址。 |
QList<QNetworkAddressEntry> addressEntries() const | 返回网络接口的地址列表。 |
QNetworkAddressEntry addressEntry() const | 返回首选网络接口地址,如果没有地址则返回空的QNetworkAddressEntry 对象。 |
QNetworkInterface::HardwareAddress macAddress() const | 返回网络接口的硬件地址(MAC地址)。 |
bool isLoopBack() const | 判断网络接口是否是回环接口。 |
bool isPointToPoint() const | 判断网络接口是否是点对点连接。 |
bool supportsMulticast() const | 判断网络接口是否支持多播。 |
bool operator==(const QNetworkInterface &other) const | 判断两个网络接口是否相等。 |
bool operator!=(const QNetworkInterface &other) const | 判断两个网络接口是否不相等。 |
QNetworkInterface类提供了丰富的功能,用于获取和处理系统中的网络接口信息。通过这些函数,可以轻松地检索有关网络接口的各种详细信息,为网络编程提供了便捷的工具。
网卡的查询非常容易实现,只需要调用通用接口QNetworkInterface::allInterfaces()即可,该函数可以直接返回指定类型的所有网络接口列表。
在解析IP地址时还需要使用QNetworkAddressEntry类,QNetworkAddressEntry是用于表示网络接口地址信息的类。它包含了IP地址、子网掩码、广播地址以及前缀长度等关键信息,为处理网络配置和操作提供了便捷的工具。通过QNetworkAddressEntry可以轻松地获取和设置网络接口的各种地址属性,用于网络编程中的接口配置和信息查询。
以下是QNetworkAddressEntry
类的一些常用函数和描述:
函数 | 描述 |
QNetworkAddressEntry() | 默认构造函数,创建一个空的QNetworkAddressEntry 对象。 |
QNetworkAddressEntry(const QNetworkAddressEntry &other) | 拷贝构造函数,根据给定的other 对象创建一个新的对象。 |
QNetworkAddressEntry &operator=(const QNetworkAddressEntry &other) | 赋值运算符,将other 对象的值赋给当前对象。 |
void setIp(const QHostAddress &address) | 设置IP地址。 |
QHostAddress ip() const | 返回IP地址。 |
void setNetmask(const QHostAddress &netmask) | 设置子网掩码。 |
QHostAddress netmask() const | 返回子网掩码。 |
void setBroadcast(const QHostAddress &broadcast) | 设置广播地址。 |
QHostAddress broadcast() const | 返回广播地址。 |
void setPrefixLength(int length) | 设置前缀长度。 |
int prefixLength() const | 返回前缀长度。 |
void clear() | 清空QNetworkAddressEntry 对象,重置为初始状态。 |
通过使用aInterface.addressEntries()我们可直接读入IP地址列表,并将其放入到QNetworkAddressEntry内保存,通过*.count()得到网卡总数量,并调用at()得到我们所需要的地址,最后就能够通过aEntry.ip().*的方式遍历出所有的地址信息,代码如下所示;
void Dialog::on_pushButton_getall_clicked()
{
QString strTemp="";
//返回主机所找到的所有网络接口的列表
QList<QNetworkInterface> netlist=QNetworkInterface::allInterfaces();
for(int i=0;i<netlist.size();i++){
QNetworkInterface interfaces=netlist.at(i);
strTemp=strTemp+"设备名称:"+interfaces.name()+"\n";//获取设备名称
strTemp=strTemp+"硬件名称:"+interfaces.hardwareAddress()+"\n";//获取硬件地址
QList<QNetworkAddressEntry> entrylist=interfaces.addressEntries();//遍历每一个ip地址对应的信息
for(int k=0;k<entrylist.count();k++){
QNetworkAddressEntry etry=entrylist.at(k);
strTemp=strTemp+"IP地址:"+etry.ip().toString()+"\n";
strTemp=strTemp+"子网掩码:"+etry.netmask().toString()+"\n";
strTemp=strTemp+"广播地址:"+etry.broadcast().toString()+"\n";
}
}
QMessageBox::information(this,"注意所有信息",strTemp,QMessageBox::Yes);
}
运行结果:
那么大,,,,,,一长条。
感谢阅读!!!!!!