百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

从零开始学Qt(83):QHostlnfo类网络编程

bigegpt 2024-12-24 10:51 5 浏览

Qt网络模块提供了用于编写TCP/IP客户端和服务器端程序的各种类,如用于TCP通信的 QTcpSocket和QTcpServer,用于UDP通信的QUdpSocket,还有用于实现HTTP、FTP等普通网络协议的高级类如QNetworkRequest,QNetworkReply和QNetworkAccessManager。

Qt网络模块还提供用于网络代理、网络承载管理的类,提供基于安全套接字层(Secure Sockets Layer,SSL)协议的安全网络通信的类。

要在程序中使用Qt网络模块,需要在项目配置文件中增加一条配置语句:

Qt += network

QHostlnfo类的功能

查询一个主机的IP地址是网络应用程序中经常用到的功能,Qt提供了 QHostlnfo类可以用于此类信息的查询。

QHostlnfo的静态函数localHostName()可获取本机的主机名,静态函数fromName()可以通过主机名获取IP地址,静态函数lookupHost()可以通过一个主机名,以异步方式查找这个主机的IP地址。下面是QHostlnfo类主要的功能函数(省略了函数中的const关键字)。

  1. 公共函数
  • QList<QHostAddress> addresses() 返回与hostName()主机关联的IP地址列表
  • HostlnfoError error() 如果主机查找失败,返回失败类型
  • QString errorString() 如果主机查找失败,返回错误描述字符串
  • QString hostName() 返回通过IP查找的主机的名称
  • int lookupId() 返回本次查找的ID
  1. 静态函数
  • void abortHostLookup(int id) 中断主机查找
  • QHostlnfo fromName(QString &name) 返回指定的主机名的IP地址
  • QString localDomainName() 返回本机DNS域名
  • QString localHostName() 返回本机主机名
  • int lookupHost(QString &name, QObject *receiver, char *member) 以异步方式根据主机名查找主机的IP地址,并返回一个表示本次查找的ID,可用于abortHostLookup()

使用QHostlnfo显示本机地址信息

为演示QHostlnfo类的主要功能,创建一个窗口基于QWidget的应用程序,实例运行时界面如图所示。对话框界面由UI设计器设计,主要代码都是各按钮的clicked()信号的槽函数。

窗口上的“获取本机主机名”和“获取本机IP地址”按钮的响应代码如下:

void Widget::on_btnGetHostName_clicked()
{ //QHostInfo获政主机信息
  QString hostName=QHostInfo::localHostName(); //本地主机名
  ui->plainTextEdit->appendPlainText ("本机主机名:"+hostName+"\n");
}

void Widget::on_btnGetIPAddress_clicked()
{
  QString hostName=QHostInfo::localHostName(); //本地主机名
  QHostInfo hostInfo=QHostInfo::fromName(hostName); //本机 IP 地址
  QList<QHostAddress> addList=hostInfo.addresses();//IP 地址列表
  if(!addList.isEmpty()){
    for(int i=0; i<addList.count(); i++){
      QHostAddress aHost=addList.at(i); //每一项是一个 QHostAddress
      bool show=ui->chkOnlyIPv4->isChecked(); // IPv4
      if(show)
      	show=(QAbstractSocket::IPv4Protocol==aHost.protocol()); //IPv4 协议
      else
      	show=true;
      if (show){
        ui->plainTextEdit->appendPlainText("协议:" + protocolName(aHost.protocol()));
        ui->plainTextEdit->appendPlainText("本机 IP 地址:"+aHost.toString ());
        ui->plainTextEdit->appendPlainText("");
      }
    }
  }
}

这段代码先通过静态函数QHostInfo::localHostName()获取本机主机名hostName,然后再使用主机名作为参数,用静态函数QHostInfo::fromName(hostName)获取主机的信息hostlnfo。 hostlnfo是QHostlnfo类的实例,通过其函数addresses()获取主机的IP地址列表。

QList<QHostAddress> addList=hostInfo.addresses();

返回的addList是QHostAddress类的列表,QHostAddress类提供一个IP地址的信息,包括IPv4地址和IPv6地址。QHostAddress有以下两个主要的函数。

  1. protocol()返回QAbstractSocket::NetworkLayerProtocol 类型变量,表示当前 IP 地址的协议类型。QAbstractSocket::NetworkLayerProtocol 枚举类型的取值如下。
  • QAbstractSocket::IPv4Protocol IPv4
  • QAbstractSocket::IPv6Protocol IPv6
  • QAbstractSocket::AnyIPProtocol IPv4或IPv6
  • QAbstractSocket::UnknownNetworkLayerProtocol 其他类型
  1. toString ()返回IP地址的字符串,

程序中显示了IP地址列表中每个IP地址的协议类型和IP地址字符串。为根据 protocol()返回的 QAbstractSocket::NetworkLayerProtocol 枚举值显示协议名称字符串,自定义了一个函数protocolName(),代码如下:

QString Widget::protocolName(QAbstractSocket::NetworkLayerProtocol protocol)
{//通过协议类型返回协议名称
  switch(protocol){
    case QAbstractSocket::IPv4Protocol:
    	return "IPv4 Protocol";
    case QAbstractSocket::IPv6Protocol:
    	return "IPv6 Protocol";
    case QAbstractSocket::AnyIPProtocol:
    	return "Any IP Protocol";
    default:
    	return "Unknown Network Layer Protocol";
  }
}

单击“获取本机IP地址”按钮,如果勾选了“只显示IPv4协议地址” 复选框,就只显示本机的IPv4地址,否则显示所有IP地址信息。

使用QHostlnfo查找主机地址信息

QHostlnfo的静态函数lookupHost()可以根据主机名、域名或IP地址查找主机的地址信息, lookupHost()函数原型如下:

int QHostInfo::lookupHost(const QString &name, QObject *receiver, const char *member)

输入参数name是表示主机名的字符串,可以是一个主机名、一个域名,或者是一个IP地址。 lookupHost()以异步方式查找主机地址,参数receiver和member指定一个响应槽函数的接收者和槽函数名称。

执行lookupHost()后,程序可能需要花一定时间来查找主机地址,但不会阻塞程序的运行。

当查找到主机地址后,通过信号通知设定的槽函数,在槽函数里读取查找的结果。函数返回一个表示查找的ID。

图中的“查找域名的IP地址”按钮的槽函数及lookupHost()函数关联槽函数代码如下:

void Widget::on_btnLookUp_clicked()
{//查找主机信息
  QString hostname=ui->edtHost->text(); //主机名
  ui->edtLookUp->appendPlainText ("正在查找主机信息:"+hostname);
  QHostInfo::lookupHost(hostname,this,SLOT(lookedUpHostlnfo(QHostInfo)));
}
void Widget::lookedUpHostlnfo(const QHostInfo &host)
{//查找主机信息的槽函数
  QList<QHostAddress> addList=host.addresses();
  if(!addList.isEmpty()){
    for(int i=0;i<addList.count();i++){
      QHostAddress aHost=addList.at(i);
      bool show=ui->chkOnlyIPv4->isChecked ();//只显不 IPv4
      if(show)
      	show=QAbstractSocket::IPv4Protocol==aHost.protocol();
      else
      	show=true;
      if(show) {
        ui->edtLookUp->appendPlainText("协议:"+protocolName(aHost.protocol()));
        ui->edtLookUp->appendPlainText(aHost.toString());
      }
    }
  }
}

————————————————

觉得有用的话请关注点赞,谢谢您的支持!

对于本系列文章相关示例完整代码有需要的朋友,可关注并在评论区留言!

相关推荐

得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践

一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...

warm-flow新春版:网关直连和流程图重构

本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...

扣子空间体验报告

在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...

spider-flow:开源的可视化方式定义爬虫方案

spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...

solon-flow 你好世界!

solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...

新一代开源爬虫平台:SpiderFlow

SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...

通过 SQL 训练机器学习模型的引擎

关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...

鼠须管输入法rime for Mac

鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...

Go语言 1.20 版本正式发布:新版详细介绍

Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...

iOS 10平台SpriteKit新特性之Tile Maps(上)

简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...

程序员简历例句—范例Java、Python、C++模板

个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...

Telerik UI for iOS Q3 2015正式发布

近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...

ios使用ijkplayer+nginx进行视频直播

上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...

IOS技术分享|iOS快速生成开发文档(一)

前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...

macOS下配置VS Code C++开发环境

本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...