1

当互联网因已连接的 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();

总的来说,一切都很好。但是,如果我在我的 Ubuntu PC 中禁用 wifi,那么我不会像预期的那样收到任何网络错误QAbstractSocket::SocketError

QAbstractSocket::NetworkError -- 7 -- 网络出现错误(例如,网络电缆被意外拔出)。

在此 Qn 之前引用了以下帖子:

问题:当互联网断开连接时,Qt 独有的接收信号的方式是什么?

4

1 回答 1

2

除非您使用的协议具有某种保持活动状态,否则如果您不发送任何内容,则不会发送任何内容,也不会尝试进行错误检查。

如果您想查看连接是否有问题,您实际上必须发送一些东西。如果电缆被拔掉或者你和远程主机之间有任何其他问题,那么(在适当的超时和重试之后)你会得到一个错误。

要查看远程主机是否以一种好的方式关闭了连接,您必须尝试读取一些内容,在这种情况下,接收调用将返回它已读取零字节。

于 2017-06-28T12:59:53.020 回答