Qt:为什么互联网断开时不会生成`QAbstractSocket :: error(QAbstractSocket :: SocketError)`信号?

时间:2017-06-28 12:55:25

标签: c++ qt qt-signals qsslsocket general-network-error

我正在尝试在已连接的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专有方式是什么?

1 个答案:

答案 0 :(得分:1)

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

如果您想查看连接是否存在问题,您实际上必须发送某些内容。如果拔下电缆或者您和远程主机之间存在任何其他问题,则(在适当的超时和重试之后)您将收到错误。

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