如何正确确定QTCPSocket中是否已达到输入结束?

时间:2010-10-27 03:39:35

标签: qt qtcpsocket eof

我有以下代码从QTCPSocket读取:

QString request;

while(pSocket->waitForReadyRead())
{
    request.append(pSocket->readAll());
}

此代码的问题在于它读取所有输入,然后在结束时暂停30秒。 (这是默认超时。)

避免长时间超时并检测到输入结束的正确方法是什么? (避免信号的答案是首选,因为这应该在一个线程中同步发生。)

2 个答案:

答案 0 :(得分:2)

唯一可以确定的方法是收到预期的确切字节数。这通常通过在数据包的开头发送数据的大小来完成。首先阅读,然后继续循环,直到你得到它。另一种方法是使用sentinel,一个特定的字节序列,用于标记数据的结尾,但这通常会变得混乱。

答案 1 :(得分:0)

如果您处理的情况类似于不包含Content-Length的HTTP响应,并且您知道另一端将在发送数据后关闭连接,则有另一种解决方案。

  1. 使用socket.setReadBufferSize确保为所有可能发送的数据提供足够的读缓冲区。
  2. 调用socket.waitForDisconnected以等待远程端关闭连接
  3. 使用socket.bytesAvailable作为内容长度
  4. 这是有效的,因为关闭连接不会丢弃QTcpSocket中的任何缓冲数据。