C++ QTcpSocket:通信数小时后的服务器响应延迟
我知道可能已经有人问过一些类似的问题,但我找到的答案并没有解决我的问题 我正在运行QTcpSocket,以便通过网络从客户端接收数据。客户端要求所有50ms的测量值,服务器响应。服务器的响应马上就来了。 运行4小时后,服务器的响应延迟约400毫秒,几天后延迟数秒。 当我重新启动服务器时,响应会立即再次出现。当延迟出现时,我重新启动客户端并再次连接到套接字,同样的延迟也会出现 我不知道我可以清除任何缓冲区或类似的东西,因为我确实读取了发送的数据,这应该会清除缓冲区。有人知道是什么原因造成了这次延误吗 在服务器上,我读到:C++ QTcpSocket:通信数小时后的服务器响应延迟,c++,qt,sockets,qt5,qtcpsocket,C++,Qt,Sockets,Qt5,Qtcpsocket,我知道可能已经有人问过一些类似的问题,但我找到的答案并没有解决我的问题 我正在运行QTcpSocket,以便通过网络从客户端接收数据。客户端要求所有50ms的测量值,服务器响应。服务器的响应马上就来了。 运行4小时后,服务器的响应延迟约400毫秒,几天后延迟数秒。 当我重新启动服务器时,响应会立即再次出现。当延迟出现时,我重新启动客户端并再次连接到套接字,同样的延迟也会出现 我不知道我可以清除任何缓冲区或类似的东西,因为我确实读取了发送的数据,这应该会清除缓冲区。有人知道是什么原因造成了这次延误
QTcpSocket* clientConnection = qobject_cast<QTcpSocket*>(sender());
QString data="";
if (clientConnection->bytesAvailable() < (int)sizeof(quint16))
return;
QByteArray tmp=clientConnection->readAll();
// Also tried:
// QByteArray tmp;
// while (clientConnection->bytesAvailable())
// tmp.append(clientConnection->readAll());
for(int i=0;i<tmp.size();i++)
data += tmp.at(i);
在客户端,我看到了答案:
if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
return;
QByteArray tmp;
while(tcpSocket->bytesAvailable())
tmp.append(tcpSocket->readAll());
for(int i=0;i<tmp.size();i++)
data += tmp.at(i);
我已经试过了
clientConnection->setSocketOption(QAbstractSocket::lowdayoption,1)//禁用Nagle算法
但什么都不管用。
有人有主意了,这里有什么问题?
欢迎任何提示。谢谢 此调用
data=data+“\n”代码>将行字符追加到数据。看起来可疑。如果您尝试对其进行注释并再次测量延迟,该怎么办?你能记录你在服务器和客户端之间交换的数据,看看它是否随时间而改变吗?是的,我已经记录了数据。客户端发送带有“Voltage1\n”的数据字符串。服务器接收该值并回答该值。当延迟增加时,客户端发送“Voltage1\n”,在wireshark中,我看到该服务器只确认,没有响应。然后,在从客户端发送一些消息之后,服务器接收到“Voltage1\nVoltage1\nVoltage1\n”,并在一个调用中回答所有三个请求。Aha。这意味着在某些情况下,系统会积累数据,需要更多的时间来处理。我还注意到,您使用循环来读取数据。它们可能会阻止您的服务器,并且在处理当前请求的过程中,它无法处理即将到来的请求。如果是这种情况,为什么一开始就可以,延迟会随着时间的推移而增加。如果我在延迟较大时停止客户端的发送,并在几分钟后再次启动。延迟是即时存在的。就像有一个完整的缓冲区,但我不知道我可以清除缓冲区。知道吗?我想这是雪球效应。例如,尝试将请求之间的时间从50毫秒增加到100毫秒。但是这个理论不能回答你的问题。也许问题出在你没提到的代码里。您可以尝试在延迟响应期间分析服务器应用程序。此调用data=data+“\n”代码>将行字符追加到数据。看起来可疑。如果您尝试对其进行注释并再次测量延迟,该怎么办?你能记录你在服务器和客户端之间交换的数据,看看它是否随时间而改变吗?是的,我已经记录了数据。客户端发送带有“Voltage1\n”的数据字符串。服务器接收该值并回答该值。当延迟增加时,客户端发送“Voltage1\n”,在wireshark中,我看到该服务器只确认,没有响应。然后,在从客户端发送一些消息之后,服务器接收到“Voltage1\nVoltage1\nVoltage1\n”,并在一个调用中回答所有三个请求。Aha。这意味着在某些情况下,系统会积累数据,需要更多的时间来处理。我还注意到,您使用循环来读取数据。它们可能会阻止您的服务器,并且在处理当前请求的过程中,它无法处理即将到来的请求。如果是这种情况,为什么一开始就可以,延迟会随着时间的推移而增加。如果我在延迟较大时停止客户端的发送,并在几分钟后再次启动。延迟是即时存在的。就像有一个完整的缓冲区,但我不知道我可以清除缓冲区。知道吗?我想这是雪球效应。例如,尝试将请求之间的时间从50毫秒增加到100毫秒。但是这个理论不能回答你的问题。也许问题出在你没提到的代码里。您可以尝试在延迟响应期间评测服务器应用程序。
if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
return;
QByteArray tmp;
while(tcpSocket->bytesAvailable())
tmp.append(tcpSocket->readAll());
for(int i=0;i<tmp.size();i++)
data += tmp.at(i);
block = command.toLatin1();
if(socket)
{
// Already tried this:
// socket->write(block,block.size());
// socket->flush();
// socket->waitForReadyRead(30000);
socket->write(block);
}