Qt项目:网络1

项目:网路


项目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 主机信息查询项目实现

  1. 显示本机地址信息
//获取本机主机名和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";
    }
}
  1. 查找主机地址信息

[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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值