2015-06-23 56 views
1

我的代碼:如何查看Qt中的網絡接口類型?

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()); 
} 

的內容的QTextEdit與無線(WLAN)網絡卡(贏8.1 64位):

----------------- 
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> 

中的QTextEdit內容與有線(LAN)網絡卡(Win7的64位/ Win10 32位):

----------------- 
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> 

我的問題是,我沒有辦法檢查網絡接口的類型,如果是「有線或無線的」是「在線」,以防止網絡管理器自動啓動,如果用戶沒有因爲此驗證連接的連接網絡(QNetworkConfigurationManager :: CanStartAndStopInterfaces):

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

這完全適用於無線連接,但是因爲沒有爲連接ca找到默認配置通過此檢查,網絡管理員無法繼續......換句話說,如果網絡連接處於活動狀態(不是ping或查詢諸如Google之類的服務器),如何檢查連接電纜。我也讀過一些以前的版本存在類似的bug。在這個版本的Qt中,例如,他的郵箱中有錯誤,那麼它會是一個錯誤?會有人的信息?謝謝

回答

1

的過程應該是,我想:

  1. 獲取從管理所有網絡配置。

  2. 對於每個活動配置,創建會話。

  3. 看看會話的界面。檢查QNetworkInterface::flags()QNetworkInterface::IsUp

這樣,您也許能夠檢查非默認會話的接口。

+0

感謝您的反應和你的時間,但對於第1步你推薦我QT發現沒有配置用於「有線」類型的接口。使用defautlconfiguration()或allconfiguration()可以返回任何類似於我上面的textEdit的內容(我指定我根本不想查詢任何內容),只是沒有爲所有類型的「有線」網絡配置找到配置。我終於決定使用回覆來處理錯誤(QNetworkReply,使用他的錯誤信號,似乎我的無線類型接口不再自動連接時執行我的QNetworkManager的實例) –

+0

爲此我想這樣做就足夠了,但是我我想知道這個問題在哪裏,我認爲QT最終會產生內部問題。糾正我或給我一個地方,看看我是否錯了我可能不是因爲它應該。再次感謝你 –

+0

這就是我開始做的,它在Linux中對我有用,但是當我在Windows中測試它時,它失敗了!QNetworkSession.interface()。isValid()在Windows中是False這樣的! – BuvinJ

2

你應該能夠檢查承載類型,看它是否是WiFi連接,即:

configuration.bearerType() == QNetworkConfiguration::BearerWLAN