【问题标题】:QTcpSocket / QTcpServer memory management / server crashQTcpSocket / QTcpServer 内存管理 / 服务器崩溃
【发布时间】:2012-08-02 15:44:28
【问题描述】:

我正在设计和制作一个每秒可以处理大约 100 次以上点击的服务器。我从服务器获得的信息只是 HTTP 标头。根据来自标头的信息,它将查询数据库(不同线程)以获取一些信息,并将最终信息发送回创建输出字符串的 QTcpServer,并发送回 HTTP 响应。我对此有一个很大的问题,我无法调试。我的代码与此类似:

TCPInterface::TCPInterface(QObject *parent): QTcpServer(parent)
{
   //start listening for tcp traffic on port 80
   listen(QHostAddress::Any, 80);

   connect(this,SIGNAL(sendInfo(QTcpSocket*, QString *)), databaseThread, SLOT(recieveInfo(QTcpSocket*, QString*)));
   connect(databaseThread, SIGNAL(sendToTCPSend(QTcpSocket *, QString *)), this, SLOT(TCPSend(QTcpSocket*, QString*)));
}

`

void TCPInterface::incomingConnection(int socket)
{
   QTcpSocket *s = new QTcpSocket(this);
   connect(s, SIGNAL(readyRead()), this, SLOT(readClient()));
   //connect(s, SIGNAL(disconnected()), this, SLOT(discardClient()));

   s->setSocketDescriptor(socket);
}

`

//void TCPInterface::discardClient()
//{
   //QTcpSocket* socket = (QTcpSocket*)sender();
   //socket->deleteLater();
//}

`

void TCPInterface::readClient()
{
  QTcpSocket* socket = (QTcpSocket*)sender();

   QString header;
   while(socket->canReadLine())
   {
      header += socket->readLine();
   }

   emit sendInfo(socket, headerInfo);
}

`

void databaseThread::recieveInfo(QTcpSocket* socket, QString* headerInfo)
{
   QString*outputInfo = getDatabaseInfo(headerInfo);
   emit sendToTCPSend(socket, outputInfo);
}

`

void TCPInterface::TCPSend(QTcpSocket* socket, QString* outputInfo);
{
    QString response = "HTTP/1.0 200 Ok\r\n";
    response += "Content-Type: text/html; charset=\"utf-8\"\r\n";
    response += "\r\n" + *outputInfo + "\n";

    if(socket->isWritable() && socket->isOpen())
    {
         socket->write(response.toAscii());
    }
    //socket->disconnectFromHost();
    socket->close();
    delete headerInfo;
 }

我有一个主要问题,我知道它是什么,但找不到解决方案。

我的问题是我的记忆力随着点击次数的增加而不断增加。我确信这是因为我的 QTcpSockets 从未被删除,因为我只是关闭它们。但是,当我不使用 close 并使用 disconnectFromHost 和 disconnected/discardClient 插槽/信号时,我的服务器将因流量大而崩溃(没有消息或任何东西,所以我不确定崩溃的确切原因)。有没有人遇到过这个问题?任何想法。

【问题讨论】:

    标签: c++ qt tcp


    【解决方案1】:

    我也有同样的问题!

    close() 假设是对象的解构器。 (QT手册QTcpSocket::~QTcpSocket()) 在那里我建议做一个实验:关闭一个套接字,然后尝试重新打开它。如果失败,说明socket对象被销毁,如果没有,说明对象应该deleter()..

    在我的情况下,客户端关闭了连接,并且调用了 disconnect() SIGNAL 并触发了与您的 discardClient() SLOT 对应的方法,我在其中删除了套接字。 当我对它进行压力测试时,当我在 I5 笔记本电脑双核上同时使用 600-800 连接轰炸它时,它通常会崩溃。它平均每 5 次崩溃一次。

    否则不会。

    很高兴进一步讨论。

    吉尔

    【讨论】:

      【解决方案2】:

      您应该在您的客户端套接字上调用deleteLater()

      connect(socket, SIGNAL(disconnected()),
              socket, SLOT(deleteLater()));
      

      【讨论】:

        猜你喜欢
        • 2012-02-13
        • 1970-01-01
        • 2018-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多