QTcpSocket :: waitForBytesWritten的行为?

Nat*_*man 10 qt tcp transmission qtcpsocket

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

直到这个功能什么时候阻止?

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

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

bdo*_*lan 7

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

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

因此,bytesWritten并且waitForBytesWritten()应该仅用于限制数据源 - 即,如果您要进入一个紧密的循环,同时将1G数据传递到套接字,您可能最终会在此过程中缓冲它并且耗尽记忆 通过触发bytesWritten信号的附加读/写,可以避免此问题.