Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QTcpSocket:通信数小时后的服务器响应延迟_C++_Qt_Sockets_Qt5_Qtcpsocket - Fatal编程技术网

C++ QTcpSocket:通信数小时后的服务器响应延迟

C++ QTcpSocket:通信数小时后的服务器响应延迟,c++,qt,sockets,qt5,qtcpsocket,C++,Qt,Sockets,Qt5,Qtcpsocket,我知道可能已经有人问过一些类似的问题,但我找到的答案并没有解决我的问题 我正在运行QTcpSocket,以便通过网络从客户端接收数据。客户端要求所有50ms的测量值,服务器响应。服务器的响应马上就来了。 运行4小时后,服务器的响应延迟约400毫秒,几天后延迟数秒。 当我重新启动服务器时,响应会立即再次出现。当延迟出现时,我重新启动客户端并再次连接到套接字,同样的延迟也会出现 我不知道我可以清除任何缓冲区或类似的东西,因为我确实读取了发送的数据,这应该会清除缓冲区。有人知道是什么原因造成了这次延误

我知道可能已经有人问过一些类似的问题,但我找到的答案并没有解决我的问题

我正在运行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);
    }