我有以下从 QTCPSocket 读取的代码:
QString request;
while(pSocket->waitForReadyRead())
{
request.append(pSocket->readAll());
}
这段代码的问题在于它读取了所有输入,然后在最后暂停了 30 秒。(这是默认超时。)
什么是避免长时间超时并检测到输入已经到达末尾的正确方法?(避免信号的答案是首选,因为这应该在线程中同步发生。)
我有以下从 QTCPSocket 读取的代码:
QString request;
while(pSocket->waitForReadyRead())
{
request.append(pSocket->readAll());
}
这段代码的问题在于它读取了所有输入,然后在最后暂停了 30 秒。(这是默认超时。)
什么是避免长时间超时并检测到输入已经到达末尾的正确方法?(避免信号的答案是首选,因为这应该在线程中同步发生。)
唯一可以确定的方法是当您收到您期望的确切字节数时。这通常通过在数据包的开头发送数据的大小来完成。先读一遍,然后继续循环,直到你读完为止。另一种方法是使用标记,即标记数据结束的特定字节序列,但这通常会变得混乱。
如果您正在处理诸如不包含 Content-Length 的 HTTP 响应之类的情况,并且您知道在发送数据后另一端将关闭连接,则有另一种解决方案。
这是因为关闭连接不会丢弃 QTcpSocket 中的任何缓冲数据。