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