3

私は、毎秒約 100 件以上のヒットを処理できるサーバーを設計および作成しています。サーバーから取得している情報は、HTTP ヘッダーのみです。ヘッダーからの情報に基づいて、いくつかの情報についてデータベース (別のスレッド) にクエリを実行し、最終的な情報を 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;
 }

それが何であるかはわかりますが、それを修正するための解決策を見つけることができないという主な問題が1つあります。

私の問題は、より多くのヒットを取得するにつれて、メモリが常に増加していることです。これの原因は、QTcpSockets を閉じているだけなので、QTcpSockets が削除されていないことだと確信しています。ただし、close を使用せず、disconnectFromHost と disconnected/discardClient スロット/シグナルを使用すると、サーバーが大量のトラフィックでクラッシュします (メッセージなどがないため、クラッシュの正確な理由はわかりません)。以前にこの問題に遭遇した人はいますか? どんなアイデアでも。

4

2 に答える 2

1

deleteLater()クライアントソケットで呼び出す必要があります:

connect(socket, SIGNAL(disconnected()),
        socket, SLOT(deleteLater()));
于 2012-08-02T17:46:46.730 に答える