2017-06-28 15 views
1

すでに接続されているSSLソケットのためにインターネットが切断されているときに信号を取得しようとしています。ここで私はQSslSocketを得ている方法は次のとおりです。ここでQt:インターネットが接続されていないときにQAbstractSocket :: error(QAbstractSocket :: SocketError)シグナルが生成されないのはなぜですか?

struct CloudSSL::Socket : public QSslSocket 
{ 
    Q_OBJECT public: 

    void ConnectSlots() 
    { 
    connect(this, SIGNAL(readyRead()), this, SLOT(ReceiveData())); 
    connect(this, SIGNAL(disconnected()), this, SLOT(Disconnected())); 
    // *** None of the above or below is invoking when internet disconnects *** 
    connect(this, SIGNAL(error(QAbstractSocket::SocketError)), 
      this, SLOT(Error(QAbstractSocket::SocketError))); 
    } 

    virtual ~Socket() 
    { 
    QObject::disconnect(); 
    QSslSocket::abort(); 
    } 

    public slots: 
    void ReceiveData() 
    { 
    LOG("Socket received data..."); 
    } 

    void Disconnected() 
    { 
    LOG("Socket got disconnected..."); 
    } 

    void Error (QAbstractSocket::SocketError error) 
    { 
    LOG("Socket error ", error); 
    } 
} 

は、それが初期化されています方法です:

m_pSSLSocket = new Socket; 
m_pSSLSocket->setProtocol(QSsl::TlsV1_2); 
m_pSSLSocket->setLocalCertificateChain(QSslCertificate::fromPath(":/Certificate.pem", QSsl::Pem)); 
m_pSSLSocket->setPrivateKey(QSslKey(privateKeyFile.readAll(), QSsl::Rsa)); 
m_pSSLSocket->setSocketOption(QAbstractSocket::LowDelayOption, true); // <--- 
m_pSSLSocket->setSocketOption(QAbstractSocket::KeepAliveOption, true); // <--- 
m_pSSLSocket->connectToHostEncrypted(SAARATHY_URL, SAARATHY_PORT); 
m_pSSLSocket->ignoreSslErrors(); 

物事は、一般的には問題なく動作します。しかし、私は私のUbuntu PCで無線LANを無効にした場合QAbstractSocket::SocketErrorから予想されるように、その後、私は、任意のネットワーク・エラーを得ることはありません:

QAbstractSocket::NetworkError - 7 - エラーがネットワーク (例えば、ネットワークで発生しましたケーブルが誤って差し込まれた)。このQnの前

呼ば次の記事:

質問:インターネットが切断されたときに、信号を受信するQtの排他的な方法は何ですか?

答えて

1

使用しているプロトコルに何らかのキープアライブがない限り、何も送信しないと何も送信されず、エラーチェックの試行は行われません。

実際に接続に問題があるかどうかを確認するには、を送信する必要があります。ケーブルが抜かれている場合や、リモートホストとの間に他の問題がある場合は、適切なタイムアウトと再試行後にエラーが発生します。

リモートホストが適切な方法で接続を閉じているかどうかを確認するには、何かを読み込もうとする必要があります。その場合、受信コールは0バイトの読み込みを返します。

+0

** Q1 **:以前の実装(Qtに移植する前)は、[この回答](https://stackoverflow.com/a/10447560/514235)で説明されている手法を使用して実装されました。それは完全にうまくいきました。インターネット切断時に通知するタイムアウトオプションを設定できました。そのような組み込み機能はQt内にありますか? ** Q2 **:(title Qn)Qtページで説明されているように 'error(...)'がそれ自体で 'QAbstractSocket :: NetworkError'で通知されないのはなぜですか? – iammilind

関連する問題