2016-07-26 697 views
1

故事:我工作的一個C++/Qt的應用與WebSocket連接到服務器。在某些使用情況下,網絡連接可能始終不可用(例如,網絡覆蓋率不佳,有人拔出網線......)。因此,只要連接再次可用,應用程序就可以重新連接到服務器。C++/Qt的反應網絡狀態改變

問題:我發現一些關於此主題的線程,使用不同的方式。事情我想:

  • QNetworkConfigurationManageronlineStateChanged信號
  • QNetworkSessionstateChanged信號

但我的插槽onNetworkStateChange不會被調用。然而,Linux本身承認,如果我拉網線:

默認控制檯

[ 2573.338735] libphy: 4a101000.mdio:00 - Link is Down 
[ 2584.358925] libphy: 4a101000.mdio:00 - Link is Up - 100/Full 

的源代碼:

websocketclient.h

class WebSocketClient : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit WebSocketClient(const QUrl &url, QObject *parent = 0); 

private slots: 
    //way 1: QNetworkConfigurationManager 
    void onNetworkStateChanged1(bool isOnline); 
    //way 2: QNetworkSession 
    void onNetworkStateChanged2(QNetworkSession::State state); 
}; 

我們bsocketclient.cpp

#include "websocketclient.h" 

WebSocketClient::WebSocketClient(const QUrl &url, QObject *parent) : 
    QObject(parent), 
    url(url) 
{ 
    //way 1 
    QNetworkConfigurationManager ncm; 
    connect(&ncm, SIGNAL(onlineStateChanged(bool)), this, SLOT(onNetworkStateChanged1(bool))); 

    //way 2 
    QNetworkConfiguration ncfg = ncm.defaultConfiguration() //i also tried the configurationFromIdentifier("eth0") 
    QNetworkSession session(ncfg); 
    connect(&session, SIGNAL(stateChanged(QNetworkSession::State)), this, SLOT(onNetworkStateChanged(QNetworkSession::State))); 

    //some websocket stuff 
} 

void WebSocketClient::onNetworkStateChanged1(bool isOnline) 
{ 
    qDebug() << "Network state changed, now" << isOnline; 
} 

void WebSocketClient::onNetworkStateChanged2(QNetworkSession::State state) 
{ 
    qDebug() << "Network state changed, now" << state; 
} 
+1

構造函數執行完成後,可能'ncm'和'ncfg'超出範圍,也許你應該將'ncm'和'ncfg'作爲'WebSocketClient'成員來實現? – KernelPanic

+0

你解決了,謝謝! – Cheesi

回答

1

ncmncfg走出去的範圍,一旦構造執行完成後,實施ncmncfgWebSocketClient成員。