我对行为有些困惑 QTcpSocket::waitForBytesWritten()...

直到何时才能阻止?

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

我看了文档,但似乎并不十分清楚。

有帮助吗?

解决方案

一般来说,OS仅为第一个问题提供简单的API-由于QT是便携式API,因此最好依靠它来指代转移到操作系统的缓冲区。如果您需要对收据的实际确认,则最好将其发送由远程应用程序发送 - 毕竟,遥控器可以ACK可以通过遥控器进行ACK,但切勿阅读遥控器的OS读取缓冲区。

如果您需要避免将遥控侧盖住您,您应该等待 QIODevice::bytesWritten 发出信号并返回事件循环进行其他工作,或者简单地设置适当的超时。通常,远程侧总是可以在一定层面上阻止您 - 即,它可以拒绝ACK,填充您的本地操作系统缓冲区,此时写道不会从QT到OS;不管什么级别 waitForBytesWritten() 在,它总是可以阻止。

像这样, bytesWrittenwaitForBytesWritten() 应仅用于防风数据的来源 - 即,如果您要一次紧密地将1G数据传递到套筒上,则最终可能会在此过程中对其进行缓冲并用尽内存。通过触发其他读取/写入 bytesWritten 信号,您可以避免此问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top