2017-06-28 3 views
1

J'essaie d'obtenir un signal lorsque Internet est déconnecté pour une socket SSL déjà connectée. Voici la façon dont je l'ai dérivé QSslSocket:Qt: Pourquoi le signal `QAbstractSocket :: error (QAbstractSocket :: SocketError)` n'est-il pas généré lorsque l'Internet est déconnecté?

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

Voici comment il est initialisé:

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(); 

Les choses fonctionnent bien en général. Cependant, si je désactive le wifi dans mon Ubuntu PC, alors je ne reçois pas d'erreur de réseau comme prévu du QAbstractSocket::SocketError:

QAbstractSocket::NetworkError - 7 - Une erreur est survenue avec le réseau (par exemple, le réseau le câble a été accidentellement bouché).

messages visés suivants avant cette Qn:

Question: Quelle est la façon exclusive Qt de recevoir un signal lorsque l'Internet est déconnecté?

Répondre

1

À moins que les protocoles que vous utilisez aient une sorte de keep-alive, si vous n'envoyez rien, rien ne sera envoyé et aucune tentative de vérification d'erreur ne sera effectuée.

Si vous voulez voir s'il y a un problème avec une connexion, vous devez réellement envoyer quelque chose. Si un câble est débranché ou s'il y a un autre problème entre vous et l'hôte distant, alors (après un délai approprié et des tentatives), vous obtiendrez une erreur.

Pour voir si l'hôte distant a fermé la connexion d'une manière agréable, vous devez essayer de lire quelque chose, auquel cas l'appel de réception retournera qu'il a lu zéro octet.

+0

** Q1 **: Ma mise en œuvre antérieure (avant le portage à Qt) a été implémentée en utilisant la technique décrite dans [cette réponse] (https://stackoverflow.com/a/10447560/514235). Cela a fonctionné parfaitement bien, où je pourrais définir une option de délai d'attente pour le moment de notifier sur la déconnexion Internet. Y a-t-il une telle installation intégrée dans Qt? ** Q2 **: (titre Qn) Pourquoi l'erreur '(...)' n'est pas signalée avec 'QAbstractSocket :: NetworkError' telle qu'elle est décrite dans la page Qt? – iammilind