我对QTcpSocket::waitForBytesWritten()
...
此功能何时阻止?
我查看了文档,但似乎不太清楚。
答案 0 :(得分:7)
一般来说,操作系统只为第一个问题提供简单的API - 因为Qt是一个可移植的API,最好只依赖它来指向传输到操作系统的缓冲区。如果你需要一个实际的收据确认,最好让它由远程应用程序发送 - 毕竟,数据可以被遥控器确认,但永远不会读取遥控器的操作系统读取缓冲区。
如果您需要避免让远程端永久阻止您,您应该等待QIODevice::bytesWritten
信号并返回事件循环以执行其他工作,或者只是设置适当的超时。一般情况下,远程端总是可以在某种程度上阻止你 - 也就是说,它可以拒绝ack,填满你的本地OS缓冲区,此时写入不会从Qt到OS;无论waitForBytesWritten()
处于什么级别,都可以阻止它。
因此,bytesWritten
和waitForBytesWritten()
应仅用于限制数据源 - 即,如果您要进入紧密循环,则将1G数据一次性传递到套接字,你最终可能会在进程中缓冲它并耗尽内存。通过使用bytesWritten
信号触发其他读/写,您可以避免此问题。