【问题标题】:Qt - Crash when I use a tcp socket to write data if tcp server first closed and then reopened connectionQt - 如果 tcp 服务器先关闭然后重新打开连接,当我使用 tcp 套接字写入数据时崩溃
【发布时间】:2022-12-07 15:34:59
【问题描述】:

我正在将我的应用程序从 Qt 4.7 迁移到 Qt 6.3。在 Qt 4.7 中一切正常。在 Qt 6.3 中,当 tcp 服务器关闭连接时,我遇到了一些问题,我再次建立连接,然后尝试写入数据。

这是我用来写入套接字的函数:

void NetworkFacility::Write(QTcpSocket& oTCPSocket, const QVariant& oV)
{
    //Controls Socket is valid
    if (oTCPSocket.state() == QAbstractSocket::ConnectedState)
    {
        QByteArray block;                           //ByteArray to serialiaze object
        MyPacket oPacket;                           //Packet to send

        //Set Size of QVariant object
        oPacket.setPacketSize(getQVariantSize(oV));
        //Set QVariant
        oPacket.setTransport(oV);

        //Create stream to write on ByteArray
        QDataStream out(&block, QIODevice::WriteOnly);
        //Sets version
        out.setVersion(QDataStream::Qt_4_7);

        //Serializes
        out << oPacket;
        //TX to socket
        oTCPSocket.write(block);
    }
}

我以这种方式管理断开连接:

void MyClient::remoteNodeDisconnected()
{
  m_pTCPSocket->flush();
  m_pTCPSocket->close();

}
void MyClient::ManagesTCPError(QAbstractSocket::SocketError socketError)
{
    //Clears last packets
    m_pTCPSocket->flush();
}

这是断开连接后代码的连接部分:

m_pTCPSocket->connectToHost(m_sIpAddress, m_iIpPort);
//Waits connection
if (m_pTCPSocket->waitForConnected(MSEC_WAIT_FOR_CONNECTION))
{
  //Print connected and exit from while loop
  break;
}

最后,这是我管理远程服务器连接的方式:

void MyClient::remoteNodeConnected()
{
    //Improve Network latency on this connection
    m_pTCPSocket->setSocketOption(QAbstractSocket::LowDelayOption, 1);
}

问题是在第一次连接时一切正常。如果服务器断开连接(即我在 LAN 中拔下服务器电缆或我关闭并重新启动服务器应用程序)然后再次连接调用:

oTCPSocket.write(block);

在 Networkfacility::Write 方法中生成崩溃。

为什么write方法重连后会crash?

【问题讨论】:

    标签: qt sockets qtcpsocket qtcpserver


    【解决方案1】:

    我通过完全删除 oTCPSocket 实例解决了这个问题。

    void MyClient::remoteNodeDisconnected()
    {
      m_pTCPSocket->flush();
      m_pTCPSocket->close();
      m_pTCPSocket.deleteLater();
      m_pTCPSocket = 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      • 2015-01-09
      • 2020-09-17
      • 2017-03-06
      相关资源
      最近更新 更多