QTcpSocket :: waitForBytesWritten的行为?

时间:2011-01-11 03:43:02

标签: qt tcp transmission qtcpsocket

我对QTcpSocket::waitForBytesWritten() ...

的行为感到有点困惑

此功能何时阻止?

  • 直到数据被写入OS的内部缓冲区以便通过TCP传输?
  • 直到数据被物理转换为TCP数据包并发送?
  • 在传输整个数据并且远程客户端确认已收到所有数据包之前?

我查看了文档,但似乎不太清楚。

1 个答案:

答案 0 :(得分:7)

一般来说,操作系统只为第一个问题提供简单的API - 因为Qt是一个可移植的API,最好只依赖它来指向传输到操作系统的缓冲区。如果你需要一个实际的收据确认,最好让它由远程应用程序发送 - 毕竟,数据可以被遥控器确认,但永远不会读取遥控器的操作系统读取缓冲区。

如果您需要避免让远程端永久阻止您,您应该等待QIODevice::bytesWritten信号并返回事件循环以执行其他工作,或者只是设置适当的超时。一般情况下,远程端总是可以在某种程度上阻止你 - 也就是说,它可以拒绝ack,填满你的本地OS缓冲区,此时写入不会从Qt到OS;无论waitForBytesWritten()处于什么级别,都可以阻止它。

因此,bytesWrittenwaitForBytesWritten()应仅用于限制数据源 - 即,如果您要进入紧密循环,则将1G数据一次性传递到套接字,你最终可能会在进程中缓冲它并耗尽内存。通过使用bytesWritten信号触发其他读/写,您可以避免此问题。