QHostInfo和QNetworkInterface的应用

本节是对基于QT的网络编程初步学习,QHostInfo的作用是查询本地主机或者指定主机的域名或地址IP。QNetworkInterface库提供的函数主要是查询主机的网络接口信息。

首先,需要在项目的**.pro文件中添加一行QT +=network,然后在头文件中加入

#include<QHostInfo>
#include<QNetworkInterface>方便全局调用

*这些库里面的函数就不介绍了,详细查阅帮助文档

以下是实列:

查询主机的名称和IP:

void MainWindow::on_btnGetHostInfo_clicked() //获取主机名称和IP
{

    QString hostname = QHostInfo::localHostName();//获取主机名称
    ui->textEdit->appendPlainText("计算机名称:"+hostname);
    QHostInfo hostinfo=QHostInfo::fromName(hostname);//通过主机名称获取IP列表
    QList<QHostAddress>list= hostinfo.addresses();

    if(list.isEmpty()){
        return;
    }
    //遍历IP列表中的项,如果勾选了显示ipv4,其他的遍历到的就跳出遍历下一个项
    foreach (auto host, list) {
        bool x=ui->chkBox_OnlyIPv4->isChecked();
        if(x&&host.protocol()!=QAbstractSocket::IPv4Protocol){continue;}
        //host.protocol()的返回值是枚举量,如果想显示协议类型名称需要转换一下,这里写了一个protoconame用于转换
        ui->textEdit->appendPlainText("协议类型:"+protoconame(host.protocol()));
        ui->textEdit->appendPlainText(host.toString());
        ui->textEdit->appendPlainText(QString("isGlobal=%1\n").arg(host.isGlobal()));//isGlobal返回一个布尔值变量,如果再加上一个字符串会显示异常,需要用Qstring转换成一个统一的字符串
    }
}

hostinfo.addresses()的返回值是一个列表,创建一个对应类型的列表存放,在查询的时候通过foreach遍历出来,如果勾选了ipv4就continue,去遍历列表中的下一个项。

host.protocol()的返回值是枚举类型,

想要显示出来需要转换一下,编写的转换函数如下:


QString MainWindow::protoconame(QAbstractSocket::NetworkLayerProtocol protocol)//protocol是枚举量,根据输入的值转换成对应的字符串
{
    switch (protocol) {
    case QAbstractSocket::IPv4Protocol:
        return "Ipv4";
    case QAbstractSocket::IPv6Protocol:
        return "Ipv6";
    default:
        return "Unknow";
    }
}

该部分功能运行效果如下:

勾选了只显示ipv4的查询:

没有勾选ipv4的查询:

再是查询指定域名的名称和IP等,原理和上面的功能差不多,可以用上面的方法直接查询,这里提供了一个函数

lookupHost函数第三种使用方式第一个参数是域名,第二个参数是接收者,一般是this,第三个是槽函数,该函数的功能是将域名传递给槽函数创建成对象进行查询,有点像前面的fromname功能。以下是具体实现:

void MainWindow::on_btnLookup_clicked()//查询域名的IP地址
{
    QString name=ui->comboBox->currentText();
    QHostInfo::lookupHost(name,this,SLOT(do_look(QHostInfo)));//这个函数的作用是将第一个参数传递给menber函数生成一个对象,相当于fromname的作用,推荐异步调用
}

void MainWindow::do_look(const QHostInfo &host)//menber槽函数
{
    QList<QHostAddress>list= host.addresses();
    ui->textEdit->appendPlainText("计算机名称:"+host.hostName());
    if(list.isEmpty()){
        return;
    }
    //遍历IP列表中的项,如果勾选了显示ipv4,其他的遍历到的就跳出遍历下一个项
    foreach (auto host2, list) {
        bool x=ui->chkBox_OnlyIPv4->isChecked();
        if(x&&host2.protocol()!=QAbstractSocket::IPv4Protocol){continue;}
        //host.protocol()的返回值是枚举量,如果想显示协议类型名称需要转换一下,这里写了一个protoconame用于转换
        ui->textEdit->appendPlainText("协议类型:"+protoconame(host2.protocol()));
        ui->textEdit->appendPlainText(host2.toString());
        ui->textEdit->appendPlainText(QString("isGlobal=%1\n").arg(host2.isGlobal()));//isGlobal返回一个布尔值变量,如果再加上一个字符串会显示异常,需要用Qstring转换成一个统一的字符串
    }
}

 QNetworkInterface的应用

QNetworkInterface::allAddresses()的作用就是查询主机所有网络接口的地址

void MainWindow::on_btnAllAddress_clicked()//QNetworkInterface::allAddresses()可以获取主机上的所有网络接口地址
{
    QList<QHostAddress>list= QNetworkInterface::allAddresses();
    if(list.isEmpty()){
        return;
    }
    //遍历IP列表中的项,如果勾选了显示ipv4,其他的遍历到的就跳出遍历下一个项
    foreach (auto host, list) {
        bool x=ui->chkBox_OnlyIPv4->isChecked();
        if(x&&host.protocol()!=QAbstractSocket::IPv4Protocol){continue;}
        //host.protocol()的返回值是枚举量,如果想显示协议类型名称需要转换一下,这里写了一个protoconame用于转换
        ui->textEdit->appendPlainText("协议类型:"+protoconame(host.protocol()));
        ui->textEdit->appendPlainText(host.toString());
        ui->textEdit->appendPlainText(QString("isGlobal=%1\n").arg(host.isGlobal()));//isGlobal返回一个布尔值变量,如果再加上一个字符串会显示异常,需要用Qstring转换成一个统一的字符串
    }
}

QNetworkInterface::allInterfaces()的作用是查询所有网络接口的信息: 

其中interface.type()返回值是枚举量需要转换一下

转换函数如下:

QString MainWindow::interFace(QNetworkInterface::InterfaceType type)//将interfacetype以字符串形式转换出来
{
    switch (type) {
    case 0:
        return "Unknown";

    case 1:
        return "Loopback";

    case 2:
        return "Virtual";

    case 3:
        return "Ethernet";

    case 4:
        return "Slip";

    case 5:
        return "CanBus";

    case 6:
        return "Ppp";

    case 7:
        return "Fddi";

    case 8:
        return "Wifi";

    case 9:
        return "Ieee80211 = Wifi";

    case 10:
        return "Phonet";

    case 11:
        return "Ieee802154";

    case 12:
        return "SixLoWPAN";

    case 13:
        return "Ieee80216";

    case 14:
        return "Ieee1394";

    default:
        return"没有找到类型";
    }
    /*
    enum InterfaceType {
        Loopback = 1,
        Virtual,
        Ethernet,
        Slip,
        CanBus,
        Ppp,
        Fddi,
        Wifi,
        Ieee80211 = Wifi,   // alias
        Phonet,
        Ieee802154,
        SixLoWPAN,  // 6LoWPAN, but we can't start with a digit
        Ieee80216,
        Ieee1394,

        Unknown = 0
    };
*/
}
void MainWindow::on_btnAllInterface_clicked()
{
    QList<QNetworkInterface>list= QNetworkInterface::allInterfaces();
    if(list.isEmpty()){
        return;
    }
    //遍历IP列表中的项,如果勾选了显示ipv4,其他的遍历到的就跳出遍历下一个项
    foreach (auto interface, list) {
        if(!interface.isValid()){continue;}
        ui->textEdit->appendPlainText("网络接口名称:"+interface.humanReadableName());
        ui->textEdit->appendPlainText("硬件地址:"+interface.hardwareAddress());
        ui->textEdit->appendPlainText("接口类型:"+interFace(interface.type()));  // interFace是上面写的函数,interface是局内变量
    }

}

 运行效果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值