代码之家  ›  专栏  ›  技术社区  ›  Nathan Osman

如何正确地确定qtcsocket中已到达输入结束?

  •  3
  • Nathan Osman  · 技术社区  · 14 年前

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

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

    如何避免长时间超时并检测到已到达输入结尾?(避免信号的答案是首选的,因为这应该在线程中同步发生。)

    2 回复  |  直到 14 年前
        1
  •  2
  •   Arnold Spence    14 年前

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

        2
  •  0
  •   Ben Last    13 年前

    如果您正在处理一种情况,例如不包含内容长度的HTTP响应,并且您知道一旦发送数据,另一端将关闭连接,则有另一种解决方案。

    1. Call socket.waitForDisconnected等待远程端关闭连接
    2. 使用socket.bytesAvailable作为内容长度

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

    推荐文章