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

Решение

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]