c++ - QTcpSocket/QTcpServer内存管理/服务器崩溃

标签 c++ qt tcp

我正在设计和制作一个服务器,它应该能够处理每秒大约 100 次以上的点击。我从服务器获取的信息只是 HTTP header 。根据 header 中的信息,它将查询数据库(不同线程)以获取一些信息,并将最终信息发送回 QTcpServer,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 slot/signal 时,我的服务器将因交通繁忙而崩溃(没有消息或任何东西,所以我不确定崩溃的确切原因)。有没有人遇到过这个问题?任何想法。

最佳答案

我也有同样的问题!

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

在我的例子中,客户端关闭了连接,并调用了 disconnect() SIGNAL 并触发了与 discardClient() SLOT 对应的方法,我在其中 deletelater() 套接字。 我压测的时候,在I5笔记本双核上同时用600-800连接轰击,经常会死机。它平均每 5 次崩溃一次。

否则它不会。

很高兴进一步讨论。

吉尔

关于c++ - QTcpSocket/QTcpServer内存管理/服务器崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11781140/

相关文章:

c++ - 如何将 const 转换为非常量

qt - 更改 QTableView 的默认选择颜色

c++ - 从多个 C++ 套接字多次读取

java - Ubuntu 上的最大 TCP 连接数

c++ - QLinkedList算子+效率

c++ - 屈服于 OpenMP 中的其他线程/任务

C++/WIN32 一个看起来很专业的应用程序——真的可能吗?

c++ - QT:无法将选择和取消选择功能添加到列表框小部件中的列表框项目

c++ - 在Qt中从父节点中查找子节点

tcp - TCP通信是2路通信吗?