【问题标题】:Qt: Why is `QAbstractSocket::error(QAbstractSocket::SocketError)` signal not generated when internet is disconnected?Qt:为什么断网时没有产生 QAbstractSocket::error(QAbstractSocket::SocketError) 信号?
【发布时间】:2017-06-28 12:55:25
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • Q1:我早期的实现(在移植到 Qt 之前)是使用 this answer 中描述的技术实现的。这工作得非常好,我可以设置一个超时选项,用于何时通知互联网断开连接。 Qt 中有这样的内置工具吗? Q2:(标题 Qn)为什么 error(...) 没有像 Qt 页面中描述的那样单独使用 QAbstractSocket::NetworkError 发出信号?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多