文章目录
项目:网路
项目1:主机信息查询
使用QHostInfo类和QNetworkInterface类可以获取主机的一些网络信息,如IP地址1和MAC地址2。
在Qt项目里使用Qt Network模块,需要在项目配置文件(.pro 文件)中增加一条配置语句:
QT += network
1.1 QHostInfo类和QNetworkInterface类
QHostInfo类常用函数
QHostInfo类可以根据主机名获取主机的IP地址,或者通过IP地址获取主机名。
- [static] QString QHostInfo::localHostName():返回本机主机名;
- [static] QString QHostInfo::localDomainName():返回本机域名系统(domain name system,DNS)域名;
- [static] QHostInfo QHostInfo::fromName(const QString &name):返回指定主机名的IP地址;
- [static] int QHostInfo::lookupHost(const QString &name, QObject *receiver, const char *member):以异步的方式根据主机名查找主机的IP地址,并返回一个表示本次查找的ID,可用作abortHostLookup()函数的参数;
- [static] void QHostInfo::abortHostLookup(int id):使用 lookupHost() 返回的 ID 终止主机查找。
- QList<QHostAddress> QHostInfo::addresses() const:返回与hostName()对应主机关联的IP地址列表;
- QString QHostInfo::hostName() const:返回通过IP地址查找到的主机名;
QNetworkInterface类常用的函数
QNetworkInterface类可以获得运行程序的主机名的所用IP地址和网络接口列表。
- [static] QList QNetworkInterface::allAddresses():返回主机上所有IP地址的列表(如果不需要知道子网掩码和广播地址);
- [static] QList QNetworkInterface::allInterfaces():返回主机上所有网络接口列表(一个网络接口可能包含多个IP地址,每个IP地址与掩码或广播地址关联);
- QList QNetworkInterface::addressEntries() const:返回网络接口的IP地址列表,包括子网掩码和广播地址;
- QString QNetworkInterface::hardwareAddress() const:返回接口的低级硬件地址,以太网里就是MAC地址;
- bool QNetworkInterface::isValid() const:如果接口信息有效就返回true;
- QNetworkInterface::InterfaceType QNetworkInterface::type() const:返回网络接口的类型;
1.2 主机信息查询项目实现
- 显示本机地址信息
//获取本机主机名和IP地址按钮
void Widget::on_btnGetHostInfo_clicked()
{
ui->plainTextEdit->clear();
QString hostName = QHostInfo::localHostName(); //本机主机名
qDebug()<<hostName;
ui->plainTextEdit->appendPlainText("HostName:"+hostName+"\n");
QHostInfo hostInfo = QHostInfo::fromName(hostName); //本机IP地址
QList<QHostAddress> addrList = hostInfo.addresses();//IP地址列表
if(addrList.isEmpty()) return;
foreach(QHostAddress host, addrList){
bool show = ui->checkBox_OnlyIPV4->isChecked(); //只显示ipv4
//Returns the network layer protocol of the host address.
show = show ? (host.protocol() == QAbstractSocket::IPv4Protocol):true;
if(show){
ui->plainTextEdit->appendPlainText("protool:"+protocolName(host.protocol()));//协议
ui->plainTextEdit->appendPlainText("HostIPAdddress:"+host.toString());
ui->plainTextEdit->appendPlainText(QString("isGolbal() = %1\n").arg(host.isGlobal()));
}
}
}
protocol()函数:返回主机地址的网络层协议。
QAbstractSocket::NetworkLayerProtocol QHostAddress::protocol() const
Returns the network layer protocol of the host address.
isGlobal()函数:如果地址是 IPv4 或 IPv6 全局地址,则返回 true,否则返回 false。全局地址是不为特殊目的(如环回或多播)或未来目的保留的地址。
bool QHostAddress::isGlobal() const
Returns true if the address is an IPv4 or IPv6 global address, false otherwise. A global address is an address that is not reserved for special purposes (like loopback or multicast) or future purposes.
自定义函数protocolName(),通过协议类型返回协议名称字符串。
//通过协议类型返回协议名称字符串
QString Widget::protocolName(QAbstractSocket::NetworkLayerProtocol protocol)
{
switch (protocol) {
case QAbstractSocket::IPv4Protocol:
return "IPV4";
case QAbstractSocket::IPv6Protocol:
return "IPV6";
case QAbstractSocket::AnyIPProtocol:
return "Any Internet Protocol";
default:
return "Unknown NetWork Layer Protocol";
}
}
- 查找主机地址信息
[static] int QHostInfo::lookupHost(const QString &name, QObject *receiver, const char *member): name表示主机名的字符串,可以是主机名、域名或IP地址;receive和member指定接收者和槽函数名称。
//查找域名的IP地址
void Widget::on_btnLookkup_clicked()
{
ui->plainTextEdit->clear();
QString hostName = ui->comboBox->currentText(); //读取主机名
ui->plainTextEdit->appendPlainText("Searching for host information:"+hostName+"\n");
QHostInfo::lookupHost(hostName, this,SLOT(do_lookedUpHostInfo(QHostInfo)));
}
//查找主机信息的槽函数
void Widget::do_lookedUpHostInfo(const QHostInfo &host)
{
QList<QHostAddress> addrList = host.addresses(); //获取主机地址列表
if(addrList.isEmpty())return;
foreach(QHostAddress host, addrList)
{
bool show = ui->checkBox_OnlyIPV4