Qt: Почему сигнал `QAbstractSocket::error(QAbstractSocket::SocketError)` не генерируется, когда интернет отключен?

Я пытаюсь получить сигнал, когда Интернет отключен для уже подключенного сокета SSL. Вот как я вывел QSslSocket:

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

В общем, все работает нормально. Тем не менее, если я отключу Wi-Fi на моем компьютере с Ubuntu, то я не получу никакой сетевой ошибки, как ожидалось от QAbstractSocket::SocketError:

QAbstractSocket::NetworkError - 7 - Произошла ошибка в сети (например, сетевой кабель был случайно отключен).

Передал следующие сообщения до этого Qn:

Вопрос: Какой эксклюзивный способ получения сигнала от Qt при отключении Интернета?

1 ответ

Если протоколы, которые вы используете, не имеют какого-либо подтверждения активности, если вы ничего не отправляете, ничего не будет отправлено и не будет предпринята попытка проверки ошибок.

Если вы хотите узнать, есть ли проблемы с соединением, вам нужно что-то отправить. Если кабель отключен или есть какие-либо другие проблемы между вами и удаленным хостом, то (после подходящего времени ожидания и повторных попыток) вы получите ошибку.

Чтобы убедиться, что удаленный хост закрыл соединение хорошим способом, вы должны попытаться что-то прочитать, и в этом случае вызов приема вернет, что он прочитал ноль байтов.

Другие вопросы по тегам