2016-07-26 696 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成员。