我正在设计和制作一台能够处理每秒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插槽/信号时,我的服务器将崩溃,流量很大(没有任何消息或任何东西,所以我不确定崩溃的确切原因)。有没有人遇到过这个问题?任何想法都可以。
答案 0 :(得分:1)
我有同样的问题!
close()假设是对象的反构造函数。 (QT手册QTcpSocket :: ~QTcpSocket()) 我建议做一个实验:关闭一个套接字,并尝试重新打开它。如果失败,则表示套接字对象已被销毁,如果不是,则表示该对象应为deletelater()..
在我的情况下,客户端关闭了连接,并且调用了disconnect()SIGNAL并且它触发了discardClient()SLOT的对应方法,其中我删除了套接字()。 当我对它进行压力测试时,当我在I5笔记本电脑双核上同时使用600-800连接进行轰击时,它通常会崩溃。它平均每5次崩溃。
其他明智的不是。
很高兴进一步讨论。
吉尔
答案 1 :(得分:0)
您应该在客户端套接字上调用deleteLater()
:
connect(socket, SIGNAL(disconnected()),
socket, SLOT(deleteLater()));
答案 2 :(得分:0)
抱歉,我认为我让一切都让人感到困惑。我尝试过使用deleteLater。
我有:
void TCPInterface::discardClient()
{
QTcpSocket* socket = (QTcpSocket*)sender();
socket->deleteLater();
}
连接到断开的信号。
此函数导致程序崩溃。无论如何deleteLater可能会导致崩溃。我不这么认为,但是当我删除套接字时,我无法想到我的程序会崩溃的任何其他原因。
另外还有一点说明。每次删除时都不会崩溃。我正在用一个不断向我发送请求的脚本对我的服务器进行压力测试,它会在第二个和第200个数据包之间的任何地方崩溃。