1
故事:我工作的一个C++/Qt的应用与WebSocket连接到服务器。在某些使用情况下,网络连接可能始终不可用(例如,网络覆盖率不佳,有人拔出网线......)。因此,只要连接再次可用,应用程序就可以重新连接到服务器。C++/Qt的反应网络状态改变
问题:我发现一些关于此主题的线程,使用不同的方式。事情我想:
QNetworkConfigurationManager
与onlineStateChanged
信号QNetworkSession
与stateChanged
信号
但我的插槽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;
}
构造函数执行完成后,可能'ncm'和'ncfg'超出范围,也许你应该将'ncm'和'ncfg'作为'WebSocketClient'成员来实现? – KernelPanic
你解决了,谢谢! – Cheesi