2016-07-26 3 views
1

話題:私はのC++/QtアプリケーションとWebsocketをサーバに接続しています。いくつかのユースケースでは、ネットワーク接続が常に利用可能でない場合があります(ネットワーク接続が悪い、ネットワークケーブルを抜くなど)。したがって、アプリケーションは、接続が再び利用可能になるとすぐにサーバーに再接続する必要があります。C++/Qtがネットワーク状態に反応しました。

問題:このトピックに関するいくつかのスレッドを、さまざまな方法で見つけました。

stateChanged信号とonlineStateChanged信号

  • QNetworkSession

    • QNetworkConfigurationManagerをしかし、私のスロットが呼ばれることは決してありませんonNetworkStateChange:私が試したもの。

      デフォルトのコンソール

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

      しかし、Linux自体は、私は、ネットワークケーブルを引く場合を認識し、我々 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は、コンストラクタの実行が完了すると、WebSocketClientメンバーとしてncmncfgを実装スコープの外に出ます。

    関連する問題