我的代碼:如何查看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&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&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步你推薦我QT發現沒有配置用於「有線」類型的接口。使用defautlconfiguration()或allconfiguration()可以返回任何類似於我上面的textEdit的內容(我指定我根本不想查詢任何內容),只是沒有爲所有類型的「有線」網絡配置找到配置。我終於決定使用回覆來處理錯誤(QNetworkReply,使用他的錯誤信號,似乎我的無線類型接口不再自動連接時執行我的QNetworkManager的實例) –
爲此我想這樣做就足夠了,但是我我想知道這個問題在哪裏,我認爲QT最終會產生內部問題。糾正我或給我一個地方,看看我是否錯了我可能不是因爲它應該。再次感謝你 –
這就是我開始做的,它在Linux中對我有用,但是當我在Windows中測試它時,它失敗了!QNetworkSession.interface()。isValid()在Windows中是False這樣的! – BuvinJ