【问题标题】:How to check a type of a network interface in Qt?如何在 Qt 中检查网络接口的类型?
【发布时间】:2015-06-23 19:34:13
【问题描述】:

我的代码:

CheckNetwork.h

#include <QMainWindow>
#include <QDebug>
#include <QNetworkInterface>
#include <QNetworkAccessManager>
#include <QNetworkConfiguration>
#include <QNetworkConfigurationManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QNetworkSession>

namespace Ui {
class CheckNetwork;
}

class CheckNetwork : public QMainWindow
{
    Q_OBJECT

public:
    explicit CheckNetwork(QWidget *parent = 0);
    ~CheckNetwork();

protected:
    void showEvent(QShowEvent *event);
private slots:
    void reply_finished();
    void network_configuration_manager_updateCompleted();
private:
    Ui::CheckNetwork *ui;
    QNetworkInterface *network_interface;
    QNetworkConfigurationManager *network_configuration_manager;
    QNetworkSession *network_session;
    QNetworkReply *reply;

};

CheckNetwork.cpp

#include "checknetwork.h"
#include "ui_checknetwork.h"


/*

Qt Creator 3.3.1 (opensource)
Qt 5.4.1 (MSVC 2010, 32 bit)

*/

CheckNetwork::CheckNetwork(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::CheckNetwork)
{
    ui->setupUi(this);
}

CheckNetwork::~CheckNetwork()
{
    delete ui;
}

void CheckNetwork::showEvent(QShowEvent *event){

    ui->textEdit->append("-----------------");
    ui->textEdit->append("NetworkInterfaces");
    ui->textEdit->append("-----------------");
    ui->textEdit->append("UP AND RUNNING:");
    network_interface = new QNetworkInterface();
    foreach (QNetworkInterface interface, network_interface->allInterfaces()) {
        if((interface.flags() & QNetworkInterface::IsUp) && (interface.flags() & QNetworkInterface::IsRunning))
            ui->textEdit->append("\t" + interface.name() + " " + interface.humanReadableName() + " " + interface.hardwareAddress());
    }


    ui->textEdit->append("-----------------------------");
    ui->textEdit->append("Network Configuration Manager");
    ui->textEdit->append("-----------------------------");
    ui->textEdit->append("ACTIVE:");
    network_configuration_manager = new QNetworkConfigurationManager(this);
    QObject::connect(network_configuration_manager, SIGNAL(updateCompleted()), this, SLOT(network_configuration_manager_updateCompleted()));
    network_configuration_manager->updateConfigurations();
}


void CheckNetwork::network_configuration_manager_updateCompleted(){
    foreach (QNetworkConfiguration configuration, network_configuration_manager->allConfigurations(QNetworkConfiguration::Active)) {
        ui->textEdit->append("\t" + configuration.name() + " " + configuration.bearerTypeName() + " " + configuration.identifier());
    }
    ui->textEdit->append("DEFAULT:");
    ui->textEdit->append("\t" + network_configuration_manager->defaultConfiguration().name() + " " + network_configuration_manager->defaultConfiguration().bearerTypeName());

    ui->textEdit->append("---------------");
    ui->textEdit->append("Network Session");
    ui->textEdit->append("---------------");
    network_session = new QNetworkSession(network_configuration_manager->defaultConfiguration(), this);
    network_session->open();
    if(network_session->isOpen()){
        ui->textEdit->append("\tisOpen");
    }else{
        ui->textEdit->append("\tnoOpen");
    }


    ui->textEdit->append("---------------");
    ui->textEdit->append("Network Manager");
    ui->textEdit->append("---------------");
    QNetworkAccessManager *network_access_manager = new QNetworkAccessManager(this);
    reply = network_access_manager->get(QNetworkRequest(QUrl("http://www.google.com")));
    QObject::connect(reply, SIGNAL(finished()), this, SLOT(reply_finished()));
}



void CheckNetwork::reply_finished(){
    ui->textEdit->append("REPLY: " + QString::number(reply->bytesAvailable()) + " byte(s)");
    ui->textEdit->append("REPLY DATAS: \n\n" + reply->readAll());
}

带有无线(WLAN)网卡(win 8.1 64bit)的QTextEdit内容:

-----------------
NetworkInterfaces
-----------------
UP AND RUNNING:
    {UUID} Wi-Fi XX:XX:XX:XX:XX:XX
    {UUID} VirtualBox Host-Only Network XX:XX:XX:XX:XX:XX
    {UUID} Loopback Pseudo-Interface 1 
    {UUID} Local Network Connexion* 2 XX:XX:XX:XX:XX:XX:XX:XX
-----------------------------
Network Configuration Manager
-----------------------------
ACTIVE:
    NetworkWireslessName WLAN XXXXXXXXX
    Local Network Connexion* 2 Unknown XXXXXXXXX
    VirtualBox Host-Only Network Ethernet XXXXXXXXX
    Wi-Fi Ethernet XXXXXXXXX
DEFAULT:
    VirtualBox Host-Only Network Ethernet
---------------
Network Session
---------------
    isOpen
---------------
Network Manager
---------------
REPLY: 256 byte(s)
REPLY DATAS: 

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.fr/?gfe_rd=cr&amp;ei=66-JVb_aJc7AULSAgcgE">here</A>.
</BODY></HTML>

带有有线(LAN)网卡(Win7 64bit / Win10 32bit)的QTextEdit内容:

-----------------
NetworkInterfaces
-----------------
UP AND RUNNING:
    {UUID} Local Network Connexion XX:XX:XX:XX:XX:XX
    {UUID} Loopback 
-----------------------------
Network Configuration Manager
-----------------------------
ACTIVE:
DEFAULT:

---------------
Network Session
---------------
    noOpen
---------------
Network Manager
---------------
REPLY: 258 byte(s)
REPLY DATAS: 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.fr/?gfe_rd=cr&amp;ei=ghGJVYecFcq50wX_u4CICg">here</A>.
</BODY></HTML>

我的问题是我没办法检查网络接口的类型,如果是“有线或无线”就在“在线”防止networkmanager自动启动连接网络(QNetworkConfigurationManager::CanStartAndStopInterfaces)如果用户未连接,因为通过此验证:

network_configuration_manager->defaultConfiguration();
if(!network_configuration_manager->isOnline()){        
        network_configuration_manager->deleteLater();
        return;
}

这非常适用于无线连接,但由于没有通过此检查找到连接电缆的默认配置,网络管理器无法继续...换句话说,如果网络连接正常,如何检查连接电缆活动的(不 ping 或查询诸如 Google 之类的服务器)。我也读过一些以前的版本存在类似的错误。例如,在这个版本的 Qt 中,我在他的消息框中有错误,那会是错误吗?会有人提供信息吗?谢谢

【问题讨论】:

    标签: qt network-programming qt5 qnetworkaccessmanager


    【解决方案1】:

    您应该能够检查承载类型以查看它是否是 wifi 连接,即:

    configuration.bearerType() == QNetworkConfiguration::BearerWLAN
    

    【讨论】:

      【解决方案2】:

      过程应该是,我认为:

      1. 从管理器获取所有网络配置。

      2. 为每个活动配置创建会话。

      3. 查看会话的界面。检查QNetworkInterface::flags() 是否有QNetworkInterface::IsUp

      这样您也可以从非默认会话中检查接口。

      【讨论】:

      • 感谢您的回复和您的时间,但对于第 1 步,您建议我 qt finds no configuration for type interfaces "wired" 。使用 defautlconfiguration() 或 allconfiguration() 会返回类似于我上面的 textEdit 内容的任何内容(我指定我不想查询或任何内容)只是没有为我的所有网卡类型“有线”找到配置。我终于决定使用reply处理错误(QNetworkReply,使用他的错误信号,似乎我的无线类型接口在执行我的QNetworkManager实例时不再自动连接)
      • 为此我想这样做就足够了,但我想知道这个问题出在哪里,我认为最终有一个内部问题 QT。如果我错了,请纠正我或给我一个地方看看我可能不是应该的。再次感谢您
      • 这是我开始做的,它在 Linux 中对我有用,但是当我在 Windows 中测试它时,它失败了! QNetworkSession.interface().isValid() 在这样的 Windows 中为 False!
      • 这可能是一个错误或尚未实现的功能。
      猜你喜欢
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多