3

我有以下从 QTCPSocket 读取的代码:

QString request;

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

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

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

4

2 回答 2

2

唯一可以确定的方法是当您收到您期望的确切字节数时。这通常通过在数据包的开头发送数据的大小来完成。先读一遍,然后继续循环,直到你读完为止。另一种方法是使用标记,即标记数据结束的特定字节序列,但这通常会变得混乱。

于 2010-10-27T04:11:14.503 回答
0

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

  1. 使用 socket.setReadBufferSize 确保有足够的读取缓冲区用于所有可能发送的数据。
  2. 调用 socket.waitForDisconnected 等待远端关闭连接
  3. 使用 socket.bytesAvailable 作为内容长度

这是因为关闭连接不会丢弃 QTcpSocket 中的任何缓冲数据。

于 2011-09-22T07:09:10.760 回答